Spring 常用的註解以及對應 XML 配置詳解

jock_javaEE發表於2024-07-23

一、@Component(value="")註解:元件

  1. 標記在類上,也可以放在介面上

  2. 註解作用:把AccountDao實現類物件交由Spring IOC容器管理

  3. 註解Value屬性:相當於bean標籤id,物件在IOC容器中的唯一標識,可以不寫,預設值是當前類首字母縮寫的類名。注入時需要注意此名稱!!。

  4. 三個衍射註解分別是:@Controller,@Service,@Repository。作用與@Component註解一樣

設計初衷增加程式碼的可讀性,體現在三層架構上:

  • @Controller一般標註在表現層
  • @Service一般標註在業務層
  • @Repository一般 標註在持久層

例子、

  註解方式
  @Component(value="accountDao")
  public class AccountDaoImpl implements AccountDao

  相當於XML配置檔案中的Bean標籤
  <bean id="accountDao" class="com.itheima.dao.impl.AccountDaoImpl"/>

注意:此註解必須搭配掃描註解使用

例子

  註解方式
  @Configuration
  @ComponentScan("com.*")
  public class SpringConfig{}

  相當於XML配置檔案中的<context:component-scan>標籤,對註解進行掃描
  <context:component-scan base-package="com.*"></context:component-scan>


二、@Autowired註解,自動注入

  1. 標記在成員變數或set方法上

  2. 註解作用:@Autowired是spring提供用於給引用型別賦值,有byName和byType兩種方式,預設使用byType方式自動注入,若是要強制至於byName方式注入,要在@Autowired註解下面加入 @Qualifier(value = “bean的id”)註解,required引數預設是true,表示開啟自動裝配,有些時候我們不想使用自動裝配功能,可以將該引數設定成false

例子、

  註解方式:在AccountServiceImpl類中注入accountDao物件
  @Service
  public class AccountServiceImpl implements AccountServic{
    @Autowired
    private AccountDao accountDao;
  }

 
  XML配置檔案方式,自動注入在AccountServiceImpl類中注入accountDao物件
  @Service
  public class AccountServiceImpl implements AccountServic{
    
      private AccountDao accountDao;

      public void setAccountDao(AccountDao accountDao){
        this.accountDao = accountDao;
      }
  } 
  spring的bean.xml
  <bean id="accountService" class="com.itheima.service.impl.AccountServiceImpl" autowire="byType">
  1. 按照變數的資料型別注入,它只能注入其他的bean型別


4. 注意事項:

成員變數的介面資料型別,有多個實現類的時候,要使用bean的id注入,否則會報錯,因為一個介面被兩個實現類實現,所以根據byType屬性型別注入已經失效了

例子、

  @Component("userAnnonService02")
  public class UserAnnonServiceImpl01 implements UserAnnonService {}

  @Component("userAnnonService01")
  public class UserAnnonServiceImpl02 implements UserAnnonService {}

  public class Test{
     @Autowired
     UserAnnonService userAnnonService;   
  } 

解決方案:Spring框架提供的註解必須指定Bean的id,使用@Qualifier的註解配合,@Qualifier註解的value屬性指定bean的id

   public class Test{
     @Autowired
     @Qualifier("userAnnonService01")
     UserAnnonService userAnnonService;   
  } 


三、@Resource(name="") 註解,自動注入

  1. 標記在成員變數或set方法上

  2. 註解作用:屬於 JDK提供的註解,預設注入方式為 byName。如果無法透過名稱匹配到對應的 Bean 的id話,注入方式會變為byType;該@Resource註解相當於@Autowired的註解與@Qualifier的註解合併

  3. name屬性:指定bean的id

  4. 如果不寫name屬性則按照變數資料型別注入,資料型別是介面的時候注入其實現類。如果定義name屬性,則按照bean的id注入。

  5. Java的JDK提供本註解


四、@Configuration註解又稱配置類註解

註解作用:作用等同於beans.xml配置檔案,在當前註解宣告的類中,編寫配置資訊,所以我們把@Configuration宣告的類稱之為配置類。

  //透過配置bean.xml的獲取
  ApplicationContext ac = new ClassPathXmlApplicationContext("beans.xml");
  accountService = ac.getBean("accountService ");

  //透過配置類,初始化Spring的ioc容器
  ApplicationContext ac = new AnnotationConfigApplicationContext(SpringConfiguration.class);
  //獲取AccountService介面的實現類物件
  accountService = ac.getBean(AccountService.class);


五、@Import註解

註解作用:匯入其他配置類(物件),標記在類上

例子、

XML配置檔案方式
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd">
    
    // 匯入dao.xml配置檔案
    <import resource="classpath:applicationContext-dao.xml"/>

    // 匯入service.xml配置檔案
    <import resource="classpath:applicationContext-service.xml"/>

    // 匯入mvc.xml配置檔案
    <import resource="classpath:applicationContext-mvc.xml"/>
</beans>

使用@Import註解方式  
@Import(DaoConfiguration.class)
@Import(ServiceConfiguration.class)
@Import(MvcConfiguration.class)
@Configuration
class MainConfiguration{} // 主配置檔案

@Configuration
class DaoConfiguration{} // dao的配置檔案

@Configuration
class ServiceConfiguration{} // service的配置檔案

@Configuration
class MvcConfiguration{} // mvc的配置檔案

引用場景

1、在配置檔案按配置專案時使用xml分層例如 mvc.xml,dao.xml,service.xml分別配置提高可讀性和可維護性,使用 import 引入同一個xml中進行讀取。

2、多個configuration配置類時使用:@Import(配置類.class) 或 @Import({配置類.class,配置類.class}) 引數為陣列載入多個配置類


六、@PropertySource註解

註解作用:引入外部屬性檔案(db.properties),標記在類上

例子、

XML配置檔案方式
<context:property-placeholder location="classpath:jdbc.properties"/>

使用@PropertySource註解方式
@Configuration
@PropertySource({"db.properties"})
public class SpringConfigClass {}
或
@Configuration
@PropertySource("classpath:db.properties")
public class SpringConfigClass {}


七、@Value註解

註解作用:給簡單型別變數賦值,標記在成員變數或set方法上

例子、

 XML配置檔案方式
 1、在classpath下新建config.properties
  jdbc.user=root
  jdbc.password=root
  jdbc.driverClass=com.mysql.jdbc.Driver

 2、在applicationContex.xml中配置匯入資原始檔
 <context:property-placeholder location="classpath:config.properties"/>

 3、之後就可以在xml中使用佔位符來獲取properties值  
 <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
    <property name="user" value="${jdbc.user}"/>
    <property name="password" value="${jdbc.password}"></property>
    <property name="jdbcUrl" value="${jdbc.jdbcUrl}"></property>
    <property name="driverClass" value="${jdbc.driverClass}"></property>
 </bean>

 使用@Value註解方式
  valueDemo.properties資原始檔
  valueName=小張

  @Configuration
  @ComponentScan(value = {"com.yang.SpringTest.annotation.valueLearn"})
  @PropertySource(value = {"classpath:valueDemo.properties"})
  public class ValueDemoConfig {
      @Value("#{valueName}")
      private String valueDemoName;
  }


八、@Bean註解

註解作用:將方法的返回值儲存到Spring IOC容器中,標記在配置類中的方法上

例子、

  XML配置檔案方式
  <?xml version="1.0" encoding="UTF-8"?>
  <beans xmlns="http://www.springframework.org/schema/beans"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://www.springframework.org/schema/beans
          http://www.springframework.org/schema/beans/spring-beans.xsd">

          <context:property-placeholder location="classpath*:db.properties"/>
          <!--注入 druid-->
          <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
              <property name="driverClassName" value="${jdbc.driver}"></property>
              <property name="url" value="${jdbc.url}"></property>
              <property name="username" value="${jdbc.username}"></property>
              <property name="password" value="${jdbc.password}"></property>
          </bean>
  </beans>

  使用@Bean註解方式
  @Configuration
  @PropertySource({"db.properties"})
  public class SpringConfigClass {
      @Value("${jdbc.driver}")
      private String dataSource;
      @Value("${jdbc.url}")
      private String url;
      @Value("${jdbc.username}")
      private String userName;
      @Value("${jdbc.password}")
      private String passWord;

      @Bean
      public DruidDataSource dataSource() {
          DruidDataSource druidDataSource = new DruidDataSource();
          druidDataSource.setDriverClassName(dataSource);
          druidDataSource.setUrl(url);
          druidDataSource.setUsername(userName);
          druidDataSource.setPassword(passWord);
          return druidDataSource;
      }
}


九、@ComponentScan("com.*")註解

註解作用:可以告訴 Spring 在指定的包或類路徑下進行元件掃描,然後自動將被掃描到的元件註冊到 Spring 容器中,標記在配置類上

例子、

      XML配置檔案方式
      <context:component-scan base-package="com.spring.annotation" use-default-filters="false">
        <context:include-filter type="custom"  expression="com.spring.annotation.filter.ColorBeanLoadFilter" />
        <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Component" />
      </context:component-scan>

      使用@ComponentScan註解方式
      @Configuration
      @ComponentScan
      public class SpringConfigClass {}

@ComponentScan註解的屬性:

  • value:指定要掃描的package; 若value值為空則掃描當前配置類的包以及子包。

  • includeFilters=Filter[]:指定只包含的元件

  • excludeFilters=Filter[]:指定需要排除的元件;

  • useDefaultFilters=true/false:指定是否需要使用Spring預設的掃描規則:被@Component, @Repository, @Service, @Controller或者已經宣告過@Component自定義註解標記的元件;

在過濾規則Filter中:

  • FilterType:指定過濾規則,支援的過濾規則有

  • ANNOTATION:按照註解規則,過濾被指定註解標記的類;

  • ASSIGNABLE_TYPE:按照給定的型別;

  • ASPECTJ:按照ASPECTJ表示式;

  • REGEX:按照正規表示式

  • CUSTOM:自定義規則;

  • value:指定在該規則下過濾的表示式;

    掃描指定類檔案
    @ComponentScan(basePackageClasses = Person.class)
    
    掃描指定包,使用預設掃描規則,即被@Component, @Repository, @Service, @Controller或者已經宣告過@Component自定義註解標記的元件;
    @ComponentScan(value = "com.yibai")
    
    掃描指定包,載入被@Component註解標記的元件和預設規則的掃描(因為useDefaultFilters預設為true)
    @ComponentScan(value = "com.yibai", includeFilters = { @Filter(type = FilterType.ANNOTATION, value = Component.class) })
    
    掃描指定包,只載入Person型別的元件
    @ComponentScan(value = "com.yibai", includeFilters = { @Filter(type = FilterType.ASSIGNABLE_TYPE, value = Person.class) }, useDefaultFilters = false)
    
    掃描指定包,過濾掉被@Component標記的元件
    @ComponentScan(value = "com.yibai", excludeFilters = { @Filter(type = FilterType.ANNOTATION, value = Component.class) })
    
    掃描指定包,自定義過濾規則
    @ComponentScan(value = "com.yibai", includeFilters = { @Filter(type = FilterType.CUSTOM, value = ColorBeanLoadFilter.class) }, useDefaultFilters = true
    

舉例、

  @Configuration
  @ComponentScan(
  includeFilters = {@ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE, value = {UserAllAnnonService.class, UserAllAnnonMapper.class})},
  useDefaultFilters = false)
  public class SpringConfigClass {}


十、@EnableAspectJAutoProxy註解

註解作用:開啟Aop註解支援,標記在配置類上


例子、

  XML配置檔案方式
  <?xml version="1.0" encoding="UTF-8"?>
  <beans xmlns="http://www.springframework.org/schema/beans"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans.xsd">
      // 開啟Aop註解支援
      <aop:aspectj-autoproxy/>
  </beans>

  使用@EnableAspectJAutoProxy註解方式
  @Configuration
  @ComponentScan
  @PropertySource("classpath:db.properties")
  @ImportResource({"classpath:beans.xml"})
  @EnableAspectJAutoProxy
  public class SpringConfigClass {...}


十一、@EnableTransactionManagement註解

註解作用:開啟註解事務控制,標記在配置類上

例子、

  XML配置檔案方式
  <?xml version="1.0" encoding="UTF-8"?>
  <beans xmlns="http://www.springframework.org/schema/beans"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans.xsd">
      // 開啟註解事務控制
      <tx:annotation-driven/>
  </beans>

  使用@EnableTransactionManagement註解方式
  @Configuration
  @ComponentScan
  @PropertySource("classpath:sqlLink.properties")
  @ImportResource({"classpath:beans.xml"})
  @EnableTransactionManagement
  public class SpringConfigClass {...}


十二、@Transactional()註解

註解作用:開啟當前方法的事務支援,標記到方法上

常用屬性:

  • transactionManager 屬性: 設定事務管理器,如果不設定預設是transactionManager。

  • isolation屬性: 設定事務的隔離級別。

  • propagation屬性: 事務的傳播行為

例子、

  @Override
  @Transactional(transactionManager = "transactionManager", isolation = Isolation.DEFAULT, propagation = Propagation.REQUIRED)
  public Integer saveUser(User user) {
     Integer integer = userMapper.saveUser(user);
     return integer;
  }

相關文章