1. 程式人生 > >Spring基於註解的IoC配置

Spring基於註解的IoC配置

基於註解的IoC配置,與在xml中配置目的是一樣的,都是降低程式碼之間的耦合度的,只是配置的形式不一樣。

使用註解的步驟:
    1、新增context的名稱控制元件和約束
    2、開啟註解掃描:由spring掃描指定的包及其子包下的所有類,如果類上使用了@Component註解,就將該類裝配到容器中
    3、在類上使用@Component註解

使用註解之前一定要先開啟註解掃描

<!-- 配置註解掃描的包:宣告到指定的包下去進行掃描,如果發現類上有對應的註解,將其裝配到容器中 -->
<context:component-scan base-package="com.demon"/>

一、使用註解裝配bean

1.1 @Component

作用:在類上面使用該註解,把資源讓spring來管理。相當於在xml中配置了一個bean

屬性:value:指定bean的id。如果不指定value屬性,預設bean的id是當前類的類名,首字母小寫。

/**
 * @Component註解:相當於配置了<bean>標籤
 * value = "util":相當於配置了bean標籤的id屬性,單獨配置value時,可以省略value屬性名稱。
 */
@Component(value="util")
public class Util {
    
}

1.2 @Controller

一般用於表現層的註解。用法與@Component相同

1.3 @Service

一般用於業務層的註解。用法與@Component相同

1.4 @Repository

一般用於持久層的註解。 用法與@Component相同

二、用於注入資料的

2.1 @Autowired

作用:自動按型別注入(將該類的子類注入進來),當使用註解注入屬性時,set方法可以省略。它只能注入其他bean型別。當有多個型別匹配時,預設使用屬性名稱作為bean的id,去容器中查詢該id的bean並注入。

2.2 @Qualifier

作用: 在自動按照型別注入的基礎之上,再按照Bean的id注入。它在給欄位注入時不能獨立使用,必須和@Autowire一起使用;但是給方法引數注入時,可以獨立使用。

屬性: value:指定bean的id。

2.3 @Resource

作用: 直接按照Bean的id注入。它也只能注入其他bean型別。 

屬性: name:指定bean的id。

2.4 @Value

作用:注入基本資料型別和String型別資料的 

屬性:value:用於指定值

三、作用範圍的註解

3.1 @Scope

作用: 指定bean的作用範圍。 

屬性: value:指定範圍的值。 取值:singleton/prototype request session globalsession

四、生命週期相關的

4.1 @PostConstruct

作用:指定某個方法為初始化方法

4.2 @PreDestory

作用:指定某個方法為銷燬方法

五、配置類相關的

5.1 @Configuration

作用: 用於指定當前類是一個spring配置類,當建立容器時會從該類上載入註解。獲取容器時需要使用AnnotationApplicationContext(有@Configuration註解的類.class)。 

/**
 * spring的配置類,相當於applicationContext.xml檔案
 * @author Demon
 * @date 2018/9/20 18:06
 */
@Configuration
public class SpringConfiguration {

}

5.2 @ComponentScan

作用: 用於指定spring在初始化容器時要掃描的包。作用和在spring的xml配置檔案中的: 

<context:component-scan base-package="com.demon"/>

屬性:Value(單獨使用可省略):用於指定要掃描的包。和標籤中的basePackages屬性作用一樣。 

/**
 * spring的配置類,相當於bean.xml檔案
 * @author Demon
 * @date 2018/9/20 18:06
 */
@Configuration
@ComponentScan({"com.demon"})
public class SpringConfiguration {

}

5.3 @PropertySource

作用: 用於載入.properties檔案中的配置。例如我們配置資料來源時,可以把連線資料庫的資訊寫到properties配置檔案中,就可以使用此註解指定properties配置檔案的位置。 

屬性: value[]:用於指定properties檔案位置。如果是在類路徑下,需要寫上classpath:

@PropertySource(value = {"classpath:jdbc.properties"})
public class JdbcConfig {
    @Value(value = "${jdbc.driverClass}")
    private String driverClassName;
    @Value(value = "${jdbc.url}")
    private String url;
    @Value(value = "${jdbc.username}")
    private String username;
    @Value(value = "${jdbc.password}")
    private String password;

    @Bean(name = {"jdbcTemplate"})
    public JdbcTemplate createJdbcTemplate(@Qualifier(value = "dataSource") DataSource dataSource) {
        return new JdbcTemplate(dataSource);
    }

    @Bean(name = {"dataSource"})
    public DataSource createDataSource() {
        DruidDataSource dataSource = new DruidDataSource();
        dataSource.setDriverClassName(driverClassName);
        dataSource.setUrl(url);
        dataSource.setUsername(username);
        dataSource.setPassword(password);
        return dataSource;
    }
}

5.4 @Import

作用: 用於匯入其他配置類,在引入其他配置類時,其他類上可以不用再寫@Configuration註解。當然,寫上也沒問題。 

屬性: value[]:用於指定其他配置類的位元組碼。 

@Configuration
@ComponentScan(value = {"com.demon"})
@Import(value = JdbcConfig.class)
public class SpringConfiguration {

}

5.5 @Bean

作用: 該註解只能寫在方法上,將方法的返回值作為一個bean,並且放入spring容器。 

屬性: name:給當前@Bean註解方法建立的物件指定一個名稱(即bean的id)。

@Bean(name = {"jdbcTemplate"})
public JdbcTemplate createJdbcTemplate(@Qualifier(value = "dataSource") DataSource dataSource) {
    return new JdbcTemplate(dataSource);
}

@Bean(name = {"dataSource"})
public DataSource createDataSource() {
    DruidDataSource dataSource = new DruidDataSource();
    dataSource.setDriverClassName(driverClassName);
    dataSource.setUrl(url);
    dataSource.setUsername(username);
    dataSource.setPassword(password);
    return dataSource;
}

5.6 通過註解獲取容器

ApplicationContext ac = new AnnotationConfigApplicationContext(SpringConfiguration.class);

六、spring的test模組整合junit

使用spring的test模組的時候需要在pom.xml檔案中引入

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-test</artifactId>
    <version>5.0.6.RELEASE</version>
</dependency>

6.1 @RunWith

作用:替換掉junit的執行器,換成一個可以初始化spring容器的執行器。

屬性:value:單獨配置時,value屬性名稱可以省略,配置SpringJUnit4ClassRunner.class來代替原來junit的執行器。

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"classpath:applicationContext.xml"})
public class AccountControllerTest {
    @Autowired
    private AccountController accountController;
}

6.2 @ContextConfiguration

作用:載入配置類或者xml配置檔案

屬性:

        value[]:用來指定xml配置檔案的路徑

        class[]: 用來指定配置類

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"classpath:applicationContext.xml"})
public class AccountControllerTest {
    @Autowired
    private AccountController accountController;
}