Spring中 Configuration的使用


@Configuration的作用

@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等价于

@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>

结果:


原文链接:https://www.cnblogs.com/xiaofuzi123456/p/12326269.html