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

结果:

posted @ 2020-02-18 15:06  阿福聊编程  阅读(2913)  评论(0编辑  收藏  举报