IOC,其实就是通过反射、xml解析等技术实现一个对象容器。通过xml配置的方式来告诉容器,应该将哪些bean到容器里,通过装配给对象属性赋值。然后在使用的时候,统一都到容器里去取。SpringBoot后就没用xml配置方式里,注解配置即可。
1 IOC容器
其实就是org.springframework.context.ApplicationContext这个类对象。如下
//初始化容器,读取applicationContext.xml来初始化bean。
//SpringBoot后其实是用的ConfigurableApplicationContext容器,没有用xml方式
ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
//到容器里根据名字来获取对象
UserServiceImpl userService = (UserServiceImpl)ctx.getBeans("userService")
2 装配
通过配置xml文件,给对象里的属性赋值。
<bean id="userService" class="com.xx.xx.UserServiceImpl"> </bean>
2.1 手动装配
就是在xml文件中,配置bean的时候,将对象的属性的值一个一个自己填写赋值进去。数据类型包括(int, String, List, Map, Properties以及对象Object)。同时还可分为属性注入和构造器注入。属性注入
,最终调用的是对象的set方法,所以每个需要装配的属性都需要提供set方法。构造器注入
,最终调用的是有参构造器。
<bean id="userService" class="com.xx.xx.UserServiceImpl">
<!--属性注入-->
<property name="age" value="12"></property>
<!--构造器注入,index代表有参构造器参数顺序-->
<constructor-arg value="12" index="0"></constructor-arg>
</bean>
2.2 自动装配
在xml文件中,配置bean的时候,例如注明 autowire=“byName”,最终在生成bean的时候,就会根据名字去自动配置。一共有三种装配方式:
byName
在容器中根据属性名称找对象
通过属性的set方法装配
找不到,不处理,默认值
找到1个,调用set方法,属性注入
找到多个---不存在该情况, 因为id是唯一的
byType
从容器中,找出同属性的类型相同的对象。
通过set方法装配
找不到,不处理,默认值。
找到1个,调用set方法,属性注入
找到多个,初始化容器的时候抛出找到符合多个条件的异常
constructor
从容器中,找同构造器参数相同的类型的对象。
通过构造器装配。
找不到,抛异常
找到1个,调用构造器方法,构造器注入
找到多个,抛异常
byName示例:
<bean id="userService" class="com.xx.xx.UserServiceImpl"> </bean>
<!-- 假设UserMgrImpl类里有一个属性名称userService, byName的意思就是根据名字到容器里找bean-->
<bean id="userMgr" class="com.xx.xx.UserMgrImpl" autowire="byName"> </bean>
网友评论