通过AnnotationConfigurationContext 或者ClassPathXml… 来加载Bean 并使用。这是最开始的读取xml的方式,不同在于
AnnotationConfigurationContext 是通过注解类来读取加载Bean、ClassPathXmlApplicationContext 是通过读取文件的方式加载Bean、
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("spring.xml");UserService userService = context.getBean("userService");userService.test();
Bean 和普通的Java对象的区别?假如我在userService 里定义 @Autowired OrderService 他肯定是有值的,根据依赖注入的原理
那么我直接new userService 那么这个OrderService 肯定是没值的。这就是区别之一。
Spring 不论如何去创建对象 都一定是使用构造方法userService 来得到对象并创建(无参构造方法)
标准无参对象创建:
无参构造函数获取对象对象userService(无值)
那么申明一点 Bean 肯定是一个java对象 。
Bean创建:
无参构造函数获取对象对象userService(无值)依赖注入(实际上就是属性赋值(加了@Autowired的赋值))最终得到 Bean
伪代码 获取对象并赋值 根据Class 字段注解来
for (Field field : ProductService.class.getClass().getFields()) { if (field.isAnnotationPresent(Autowired.class)) { //set } }
实际上在Bean获取到之前 之后还有一些初始化步骤
假如想要在某一个Service 里增加一个对象User ,(想要的Mysql中的注入的值)
如果想要在User 对象里定义自己想要的值,单单通过@Autowired 无法注入,如果注入 也只能拿到空对象,无法拿到数据库里的值
依赖注入(实际上就是属性赋值(加了@Autowired的赋值))初始化前 (找方法里加了PostConstract注解的)初始化初始化后(AOP)代理对象最终得到 Bean
此时可以使用@PostConstract注解,原理和之前的@Autowired 读取方式相同。也是读取field上的annotation来
@PostConstruct public void a() { }
当时还有另外一个方式 通过实现InititalizeBean 也是Spring 提供的接口,可以实现这个功能
atnceOf 来 InitailzeBean 然后判断成功,会对象进行强制转化。
InitailzeBean 对象,源码:
实际上就是一行代码,就多了一个安全管理器的判断。
那么接着看:
初始化后(AOP)代理对象最终得到 Bean Bean在创建的时候
默认使用无参的构造函数但是多个构造函数的时候 会报错(两个有参构造方法):错误信息 找不到默认的构造方法 @Autowired找Bean逻辑
先根据类型去找,如果没找到或者有多个同名 则再根据名字BeanName去找