Spring中@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>
结果: