@Configuration主要是用來定於定義配置類,可用於代替xml配置文件。
一、@Configuation加載Spring方法
1.1、@Configuration配置spring並啟動spring容器
@Configuration標注在類上,相當於把該類作為spring的xml配置文件中的<beans>
,作用為:配置spring容器(應用上下文)
@Configuration
public class MyConfigtion {
public MyConfigtion(){
System.out.println("容器初始化!!!!!!!!!!!!");
}
}
相當於:
<?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">
<bean id="myConfigtion" class="springclouddemo.springconfigtion.configtion.MyConfigtion"></bean>
</beans>
主方法進行測試:
public class TestConfigution {
public static void main(String[] args) {
// ApplicationContext applicationContext=new AnnotationConfigApplicationContext(MyConfigtion.class);
ApplicationContext applicationContext=new ClassPathXmlApplicationContext("spring-context.xml");
MyConfigtion myConfigtion = (MyConfigtion)applicationContext.getBean("myConfigtion");
}
}
從運行主方法結果可以看出,spring容器已經啟動了:
1.2、@Configuration啟動容器+@Bean注冊Bean
@Bean標注在方法上(返回某個實例的方法),等價於spring的xml配置文件中的<bean>
,作用為:注冊bean對象
bean類:
public class UserBean {
private String username;
private String password;
public UserBean(){
System.out.println("Bean的實例化");
}
public UserBean(String username, String password) {
this.username = username;
this.password = password;
}
public String getUsername() {
return username;
}
public String getPassword() {
return password;
}
public void setUsername(String username) {
this.username = username;
}
public void setPassword(String password) {
this.password = password;
}
@Override
public String toString() {
return "UserBean{" + "username='" + username + '\'' + ", password='" + password + '\'' + '}';
}
public void say(){
System.out.println("說的好!!!!!!!");
}
}
配置類:
@Configuration
public class MyConfigtion1 {
public MyConfigtion1(){
System.out.println("容器初始化!!!!!!!!!!!!");
}
@Bean
public UserBean userBean(){
return new UserBean();
}
}
主方法測試類:
public class TestConfigution {
public static void main(String[] args) {
ApplicationContext applicationContext=new AnnotationConfigApplicationContext(MyConfigtion1.class);
UserBean userBean = (UserBean)applicationContext.getBean("userBean");
userBean.say();
/* ApplicationContext applicationContext=new ClassPathXmlApplicationContext("spring-context.xml");
MyConfigtion myConfigtion = (MyConfigtion)applicationContext.getBean("myConfigtion");*/
}
}
結果:
注:
(1)、@Bean注解在返回實例的方法上,如果未通過@Bean指定bean的名稱,則默認與標注的方法名相同;
(2)、@Bean注解默認作用域為單例singleton作用域,可通過@Scope(“prototype”)設置為原型作用域;
(3)、既然@Bean的作用是注冊bean對象,那么完全可以使用@Component、@Controller、@Service、@Ripository等注解注冊bean,當然需要配置@ComponentScan注解進行自動掃描。
1.3、@Configuration啟動容器+@Component注冊Bean
bean類:
@Component
public class UserBean {
private String username;
private String password;
public UserBean(){
System.out.println("Bean的實例化");
}
public UserBean(String username, String password) {
this.username = username;
this.password = password;
}
public String getUsername() {
return username;
}
public String getPassword() {
return password;
}
public void setUsername(String username) {
this.username = username;
}
public void setPassword(String password) {
this.password = password;
}
@Override
public String toString() {
return "UserBean{" + "username='" + username + '\'' + ", password='" + password + '\'' + '}';
}
public void say(){
System.out.println("說的好!!!!!!!");
}
}
配置類:
@Configuration
@ComponentScan(basePackages = "springclouddemo.springconfigtion")
public class MyConfigtion1 {
public MyConfigtion1(){
System.out.println("容器初始化!!!!!!!!!!!!");
}
/*@Bean
public UserBean userBean(){
return new UserBean();
}*/
}
主方法測試獲取bean對象:
public class TestConfigution {
public static void main(String[] args) {
ApplicationContext applicationContext=new AnnotationConfigApplicationContext(MyConfigtion1.class);
UserBean userBean = (UserBean)applicationContext.getBean("userBean");
userBean.say();
/* ApplicationContext applicationContext=new ClassPathXmlApplicationContext("spring-context.xml");
MyConfigtion myConfigtion = (MyConfigtion)applicationContext.getBean("myConfigtion");*/
}
}
@Configuation等價於<Beans></Beans>
@Bean等價於<Bean></Bean>
@ComponentScan等價於<context:component-scan base-package="com.dxz.demo"/>
二、組合多個配置類
2.1、在@configuration中引入spring的xml配置文件
@Configuration
@ImportResource("classpath:spring-context.xml")
public class MyConfigtion2 {
}
bean類:
public class UserBean1 {
private String username;
private String password;
public UserBean1(){
System.out.println("Bean的實例化");
}
public UserBean1(String username, String password) {
this.username = username;
this.password = password;
}
public String getUsername() {
return username;
}
public String getPassword() {
return password;
}
public void setUsername(String username) {
this.username = username;
}
public void setPassword(String password) {
this.password = password;
}
@Override
public String toString() {
return "UserBean{" + "username='" + username + '\'' + ", password='" + password + '\'' + '}';
}
public void say(){
System.out.println("說的好!!!!!!!");
}
}
測試類:
public class TestConfigution {
public static void main(String[] args) {
ApplicationContext applicationContext=new AnnotationConfigApplicationContext(MyConfigtion2.class);
UserBean1 userBean1 = (UserBean1)applicationContext.getBean("userBean1");
userBean1.say();
/* ApplicationContext applicationContext=new ClassPathXmlApplicationContext("spring-context.xml");
MyConf3 qweigtion myConfigtion = (MyConfigtion)applicationContext.getBean("myConfigtion");*/
}
}
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"> <bean id="myConfigtion2" class="springclouddemo.springconfigtion.configtion.MyConfigtion2"></bean> <bean id="userBean1" class="springclouddemo.springconfigtion.po.UserBean1"></bean> </beans>
結果: