Spring注解驱动开发——自动装配 方法,构造器位置的自动装配
@Autowired构造器 方法 参数 属性;都是从容器中获取参数组件的值
1 【标在方法位置】;@Bean + 方法参数;参数从容器中获取;默认不写@Autowired效果是一样的;都能自动装配;
2 标在构造器上 如果组件只有一个有参构造器,这个有参构造器的@Autowired 可以省略,参数位置的组件还是可以从容器中获取
3 放在参数位置
一丶标在方法位置(Set 方法)
有一个Boss组件,在Boss组件里装配Car 类 在set 方法上标注 @Autowired;用@Component 标注这是一个组件, 用 @ComponentScan 扫描 该类上的包,注入到ioc 容器中
组件类
Boss
package com.mongoubiubiu.bean; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @Component public class Boss { private Car car; public Car getCar() { return car; } @Autowired //标注在方法,Spring容器创建当前对象,就会调用方法,完成赋值; //方法使用的参数,自定义类型的值从ioc容器中获取 public void setCar(Car car) { this.car = car; } @Override public String toString() { return "Boss [car=" + car + "]"; } }
Car
package com.mongoubiubiu.bean; import org.springframework.stereotype.Component; @Component public class Car { public Car(){ System.out.println("car constructor....."); } public void init(){ System.out.println("car init......."); } public void destory(){ System.out.println("car destory......."); } }
配置类
package com.mongoubiubiu.conf; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Primary; import com.mongoubiubiu.dao.UserDao; import com.mongoubiubiu.service.serviceImpl.UserServiceImpl; @Configuration @ComponentScan({"com.mongoubiubiu.service","com.mongoubiubiu.bean","com.mongoubiubiu.dao","com.mongoubiubiu.controller"}) public class MainConfigOfAutowired { @Bean("userDao2") public UserDao userDao(){ UserDao user=new UserDao(); user.setLable("2"); return user; } }
测试类
package com.mongougbiubiu.test; import org.junit.Test; import org.springframework.context.ApplicationContext; import org.springframework.context.annotation.AnnotationConfigApplicationContext; import org.springframework.context.annotation.Scope; import com.mongoubiubiu.bean.Boss; import com.mongoubiubiu.bean.Car; import com.mongoubiubiu.conf.MainConfigOfAutowired; import com.mongoubiubiu.conf.MainConfigOfLifeCycle; import com.mongoubiubiu.dao.UserDao; import com.mongoubiubiu.service.UserService; import com.mongoubiubiu.service.serviceImpl.UserServiceImpl; public class IOCTest_Autowired { @Test public void Test01(){ //创建ioc 容器 AnnotationConfigApplicationContext applica= new AnnotationConfigApplicationContext(MainConfigOfAutowired.class); //UserService userService=applica.getBean(UserServiceImpl.class); Boss boss=applica.getBean(Boss.class); //ioc 容器中的bean Car car=applica.getBean(Car.class); //自动装配的Car System.out.println(boss); System.out.println(car); //System.out.println(userService); } }
结果
发现ioc 容器中的bean 和 自动装配的bean 对象是一样的 说明可以通过用@Autowired 标注在Set 方法上 ,来装配 bean
二丶放在构造器上
默认加在ioc 容器中的组件,容器启动会调用无参构造器创建对象,再进行初始化赋值等操作
组件类
package com.mongoubiubiu.bean; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; //默认加在ioc 容器中的组件,容器启动会调用无参构造器创建对象,再进行初始化赋值等操作 @Component public class Boss { private Car car; //构造器要用的组件都是从容器中获取 @Autowired public Boss(Car car){ this.car=car; System.out.println("boss 有参构造器"); } public Car getCar() { return car; } //@Autowired //标注在方法,Spring容器创建当前对象,就会调用方法,完成赋值; //方法使用的参数,自定义类型的值从ioc容器中获取 public void setCar(Car car) { this.car = car; } @Override public String toString() { return "Boss [car=" + car + "]"; } }
其余都和上面一样
测试 发现容器中的bean 和从构造器装配的bean 为同一对象
还可以放在参数上
测试
为同一对象 效果一样,之前 set 方法 也可以标注在参数上
三 丶标在方法位置(@Bean + 方法参数;参数从容器中获取;默认不写@Autowired效果是一样的;都能自动装配;)
组件类
新建Color 里面的属性信息 和boss 一样 ,装配方式用 @Ben
package com.mongoubiubiu.bean; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; public class Color { private Car car; public Car getCar() { return car; } //@Autowired //标注在方法,Spring容器创建当前对象,就会调用方法,完成赋值; //方法使用的参数,自定义类型的值从ioc容器中获取 public void setCar(Car car) { this.car = car; } @Override public String toString() { return "Color [car=" + car + "]"; } }
配置类 用@Bean 的方式 将组件注入到容器中
package com.mongoubiubiu.conf; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Primary; import com.mongoubiubiu.bean.Car; import com.mongoubiubiu.bean.Color; import com.mongoubiubiu.dao.UserDao; import com.mongoubiubiu.service.serviceImpl.UserServiceImpl; @Configuration @ComponentScan({"com.mongoubiubiu.service","com.mongoubiubiu.bean","com.mongoubiubiu.dao","com.mongoubiubiu.controller"}) public class MainConfigOfAutowired { @Bean("userDao2") public UserDao userDao(){ UserDao user=new UserDao(); user.setLable("2"); return user; } @Bean public Color color(Car car){ Color color =new Color(); color.setCar(car); return color; } }
测试类
package com.mongougbiubiu.test; import org.junit.Test; import org.springframework.context.ApplicationContext; import org.springframework.context.annotation.AnnotationConfigApplicationContext; import org.springframework.context.annotation.Scope; import com.mongoubiubiu.bean.Boss; import com.mongoubiubiu.bean.Car; import com.mongoubiubiu.bean.Color; import com.mongoubiubiu.conf.MainConfigOfAutowired; import com.mongoubiubiu.conf.MainConfigOfLifeCycle; import com.mongoubiubiu.dao.UserDao; import com.mongoubiubiu.service.UserService; import com.mongoubiubiu.service.serviceImpl.UserServiceImpl; public class IOCTest_Autowired { @Test public void Test01(){ //创建ioc 容器 AnnotationConfigApplicationContext applica= new AnnotationConfigApplicationContext(MainConfigOfAutowired.class); //UserService userService=applica.getBean(UserServiceImpl.class); Boss boss=applica.getBean(Boss.class); Color color=applica.getBean(Color.class); //ioc 容器中的bean Car car=applica.getBean(Car.class); //自动装配的Car System.out.println(boss); System.out.println(car); System.out.println(color); //System.out.println(userService); } }
打印发现 三个bean 为同一对象 都是从容器中获取 的 ,说明
@Bean + 方法参数;参数从容器中获取;默认不写@Autowired效果是一样的;都能自动装配;