Ch01 IOC
# IOC
例:需要实现以下效果

使用Spring框架:
1.前两步可以交给spring来完成,即通过beans来创建对象(反射机制)
以下为配置bean的方法,类名为包名.类名
自动调用set方法赋值,此称作为一个ioc容器

使用ioc容器创建对象

Bean的配置:
通过全类名反射的方式在IOC容器中配置bean,所以要求bean有无参构造方法
id: 标识容器的id
初始化IOC容器对象:用ApplicationContext(接口,底层是beanFactory)。
-- ClassPathXMLApplicationContext(类路径下的xml配置文件)
-- FileSystemXMLApplicationContext(从文件系统中加载配置文件)
最好使用id来getbean,使用反射的话要确保bean中class的唯一
引入其他bean配置文件:
依赖注入的方式: (Car类)
--属性注入:setter方法(最常用)
--构造器注入:构造器中赋值 <constructor -arg></constructor -arg>
如果字面值有特殊字符可以用![CDATA[XXX]]进行包裹



bean之间相互引用:(Person类,其中属性为Car类)
value只能表示基本数据类型,引用要用ref,值为别的bean的id

也可以使用内部bean:(可以不写id, 不能被外部bean引用)

使用级联赋值必须要在大类里面有get小类的方法:

# 特殊类型的注入,c,p


Property类(键值对,用来存放配置文件)的使用**:**
https://blog.csdn.net/bo123_/article/details/89059799
bean配置:

可以使用p命名空间来简化bean配置(需要导入命名空间p):
p命名空间为通过set方法注入的简化版
c命名空间为通过构造器属性注入的简化版
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:c="http://www.springframework.org/schema/c"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="yhr" class="User">
<property name="id" value="123"></property>
<property name="name" value="yhr"></property>
</bean>
<bean id="zm" class="User" p:name="zm" p:id="456" ></bean>
<bean id="yxb" class="User" c:id="444" c:name="yxb"></bean>
</beans>
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Spring4.x可以泛型注入引用:
在父类中注解自动装配,可以为子类注入子类对应的泛型类型的成员变量的引用 
https://www.cnblogs.com/xiximayou/p/12161517.html
# Bean
bean 生命周期:https://www.cnblogs.com/zrtqsk/p/3735273.html

XML:
bean的自动装配:会自动装配所有属性,不够灵活,一般不用,只有在整合第三方框架时会用
Person类中包含属性:Car 和 Address
- 使用byName自动装配:当bean的id与属性名一样时可以使用

- 使用byType自动装配:必须要是唯一的类型

- 不推荐使用constructor
使用注解自动装配:
导入约束
配置注解的支持
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:c="http://www.springframework.org/schema/c"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
https://www.springframework.org/schema/context/spring-context.xsd">
<bean id="yhr" class="User">
<property name="id" value="123"></property>
<property name="name" value="yhr"></property>
</bean>
<bean id="zm" class="User" p:name="zm" p:id="456" ></bean>
<bean id="yxb" class="User" c:id="444" c:name="yxb"></bean>
<context:annotation-config></context:annotation-config>
</beans>
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

@Autowired默认ByType,在相同类型有多个类的时候byname


# bean作用域,继承,依赖,创建

bean之间的关系:
继承:使用bean中的parent属性, 可以覆盖父bean中的属性

可以在父bean中设置属性abstract = “true” 来表示该bean不能被实例化,只能作为模板给别的 bean继承
若一个bean中的class属性没有被指定,那么该bean必须被指定为一个抽象bean
依赖:使用bean中的depends-on属性,若没有依赖bean,则在初始化的时候会报错

前置依赖的bean会在本bean创建之前被创建好,若依赖于多个bean,则可以用逗号或者空格隔开。
用静态工厂方法来创建bean
- 创建一个静态工厂类:

.配置bean

使用bean

用实例工厂方法来创建bean:
- 创建一个实例工厂类:

- 配置文件:

使用Spring自带的接口,FactoryBean来配置bean:
1.创建一个FactoryBean,实现接口FactoryBean

2.配置文件:

# IOC容器中bean的生命周期管理:
调用构造器或者工厂方法来创建bean
为bean中的属性赋值,以及对其他bean的引用
调用bean的初始化方法
bean可以使用了
当容器关闭时,调用destroy-method方法
before和after方法定义在Car类中
可以在bean的初始化时给属性inti-method和destory-method赋值:

创建bean的后置处理器:可以对bean中所有的对象进行处理,而不是对单一对象,可以在初始化前后进行操作,实现的接口为:postbefore(after)initialization
作用:检查bean的赋值是否正确以及按照一定的标准给bean的属性赋值
需要实现BeanPostProcessor接口,不需要配置id,IOC会自动识别
参数:bean即为创建的bean,beanName即为bean的id
返回值:程序拿到的bean(可以在实现的两个方法中设置返回的bean,甚至返回新的bean)

