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;
}