首先我们创建context容器 然后进行测试
/** * @Author: xzc * @Date: 2021/8/20 23:50 * @Version 1.0 */ public class XzcSpringBeanLearnMain { public static void main(String[] args) { /** * userService.class -> 推断构造(默认无参构造方法 有参构造方法会去ioc里根据类型 名字 拿入参 没有报错) -> 对象 -> 依赖注入(属性赋值)-> 初始化前(@PostConstruct) -> 初始化(实现InitializingBean接口) ->初始化后(aop->代理对象) -> baen * note 有参构造方法赋值的成员 在后面的依赖注入这些流程中同成员变量会被覆盖 */ ApplicationContext context=new AnnotationConfigApplicationContext(AppConfig.class); UserService userService = context.getBean(UserService.class); userService.test(); userService.orderService.test(); } }
context容器需要传入配置类去配置扫描包路径 这些好扫描bean
@ComponentScan("com.xzc.sourcelearn.basebeanlife") @EnableTransactionManagement @Configuration public class AppConfig { @Bean public OrderService orderService6(){ System.out.println("ioc input orderService2"); return new OrderService(6); } @Bean public OrderService orderService1(){ System.out.println("ioc input orderService1"); return new OrderService(1); } //............... }
我们需要创建我们做实验的类userService
/** * @Author: xzc * @Date: 2021/9/2 23:56 * @Version 1.0 */ @Component public class UserService implements InitializingBean { @Autowired OrderService orderService; /** * 原始方式一 依赖注入 */ // @Autowired User loginUser; /** * 原始方式0 推断构造 默认无参 */ // public UserService(OrderService orderService, User loginUser) { // System.out.println("1"); // this.orderService = orderService; // this.loginUser = loginUser; // } public UserService(OrderService orderService6) { System.out.println(" 有参构造 自定义 order2 "); this.orderService = orderService6; } // public UserService() { // System.out.println("123"); // } /** * 方法二 初始化前 */ @PostConstruct public void redefindUser(){ System.out.println("redefindUser 自定义 order user "); this.loginUser = new User(); // this.loginUser.setName("xzc"); this.orderService = new OrderService(3); } public void test(){ System.out.println("UserService test 哈哈哈"); } /** * 方法三: 初始化 实现InitializingBean接口 afterPropertiesSet 详细看源码注解 */ @Override public void afterPropertiesSet() throws Exception { System.out.println("afterPropertiesSet 自定义 order user"); this.loginUser = new User(); this.orderService = new OrderService(3); } }
userService里面包含我们的orderService
@Component public class OrderService { Integer order = 0; public OrderService(Integer order) { this.order = order; } public OrderService() { } public void test(){ System.out.println("OrderService test 哈哈哈 "+order); } }
运行的结果
结论
userService.class -> 推断构造(默认无参构造方法 有参构造方法会去ioc里根据类型 名字 拿入参 没有报错) -> 对象 -> 依赖注入(属性赋值)-> 初始化前(@PostConstruct) -> 初始化(实现InitializingBean接口) ->初始化后(aop->代理对象) -> baen
需要注意的是覆盖关系对象内的同一成员变量 后面的流程会覆盖前面的