IoC概述
目的:降低耦合度
底层原理:xml解析、工厂模式、反射
在工厂模式中,通过xml解析技术解析xml,获取类的全限定类名,通过反射创建对象,并返回
bean创建注入
xml
```java
<!--set方法注入-->
<bean id="s1" class="cn.ccb.Person">
<property name="id" value="1001"/>
<property name="username" value="ccb"/>
</bean>
<!--构造方法注入-->
<bean id="s2" class="cn.ccb.Person">
<constructor-arg value="小明" index="1"/><!--index:索引,匹配构造器中相应的参数-->
<constructor-arg value="1002" index="0"/>
</bean>
<!--ref属性-->
<bean id="s3" class="cn.ccb.Person">
<property name="username" value="Tony"/>
<property name="teacher" ref="ss"/>
</bean>
<bean id="ss" class="cn.ccb.Teacher">
<property name="tid" value="1001"/>
<property name="tname" value="master"/>
</bean>
<!--集合属性-->
<bean id="t1" class="cn.ccb.Teacher">
<property name="students">
<list>
<ref bean="s1"/>
<ref bean="s2"/>
</list>
</property>
</bean>
<bean id="t2" class="cn.ccb.Teacher">
<property name="bossMap">
<map>
<entry>
<key><value>"1003"</value></key>
<value>boss</value>
</entry>
<entry>
<key><value>"1004"</value></key>
<value>"master"</value>
</entry>
</map>
</property>
</bean>
```
```java @org.junit.Test public void test(){ // 获取容器 ApplicationContext ac=new ClassPathXmlApplicationContext("applicationContext.xml");
// bean的获取方式
Person person1 = (Person) ac.getBean("s1");
// Person person2 = ac.getBean(Person.class);
Teacher t2 = ac.getBean("t2", Teacher.class);
System.out.println(t2);
}
```
bean作用域
- singleton(单例):容器启动时就会创建bean对象
- prototype(多例):在使用时创建
bean生命周期
调用构造器创建bean实例
为bean的属性设置值(依赖注入)
- 调用bean的初始化方法
- 使用bean
- 容器关闭,bean销毁
bean的后置处理器
- bean后置处理器允许在调用bean的初始化方法前后对bean进行额外处理
- bean后置处理器是对IOC容器里的所有bean实例进行处理
- 需要实现接口
BeanPostProcessor
,并在容器中配置该bean
```java public class AfterHandler implements BeanPostProcessor { public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { System.out.println("前置处理器....."); return bean; }
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
System.out.println("后置处理器.......");
return bean;
}
} ```
```markdown
xml中配置该bean
```
引用外部资源文件
```java
```
组件扫描
包含
java <context:component-scan base-package="cn.ccb" use-default-filters="false"> // false <context:include-filter type="annotation" expression="org.springframework.stereotype.Service"/> <context:include-filter type="assignable" expression="cn.ccb.controller.UserController"/> </context:component-scan>
排除
java <context:component-scan base-package="cn.ccb" use-default-filters="true"> // true <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Repository"/> <context:exclude-filter type="assignable" expression="cn.ccb.service.UserService"/> </context:component-scan>