Spring IOC学习笔记
本人学习java Spring过程中发现对于旧知识总是会有遗忘,为此,写下本篇文章作为记录。
本文主要描述Spring的IOC模块
1、IOC的目的是为了实现高内聚低耦合,利用了xml解析、工厂模式、反射。

我们自己定义的各个 Bean 其实会转换成一个个 BeanDefinition 存在于 Spring 的 BeanFactory 中。
2、IOC的执行过程
1)解析xml文件,配置创建的对象
2)使用工厂类
3、IOC容器底层使用了BeanFactory和ApplicationContext,其中BeanFactoy是ApplicationContext的父类。

代码如下:
ApplicationContext context = new ClassPathXmlApplicationContext("bean.xml");
其中bean.xml为xml文件,存放着配置好的对象的参数。如下图所示:
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="user" class="com.study.day01.User"> <property name="age" value="18"></property> <property name="name" value="ww"></property> //需要有set函数 </bean> <bean id="user1" class="com.study.day01.User"> <constructor-arg name="age" value="19"></constructor-arg> <constructor-arg name="name" value="zy"></constructor-arg> //使用constructor-arg需要类存在构造器
</bean> </beans>
class为类的路径,id为对象的唯一标识符,上述xml建立了两个User对象,id分别为user和user1。
为了获取上述两个对象,需要如下代码:
User user = context.getBean( "user", User.class);
User user1 = context.getBean( "user1", User.class);
4、IOC注入Bean
1)外部注入
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="service" class="com.study.day01.service.Service"> <property name="client" ref="dao"></property> </bean> <bean id="dao" class="com.study.day01.client.ClientImp"> </bean> </beans>
上述xml使用了外部注入的方法,service.client在外部创建,由ref映射
2)内部注入
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="emp" class="com.study.day02.Emp"> <property name="age" value="18"></property> <property name="name" value="ww"></property> <property name="dep"> <bean id="dep" class="com.study.day02.Dep"> <property name="depName" value="保安"></property> </bean> </property> </bean> </beans>
5、注入List、Map、Array对象
1)内部注入
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="stu" class="com.study.day02.Stu"> <property name="courses"> <array> <value>数学</value> <value>英语</value> <value>语文</value> </array> </property> <property name="list"> <list> <value>1</value> <value>2</value> <value>3</value> </list> </property> <property name="map"> <map> <entry key="JAVA" value="java"></entry> <entry key="CPP" value="c++"></entry> </map> </property> </bean> </beans>
2)外部注入
<?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:util="http://www.springframework.org/schema/util" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd"> <util:list id="bookList"> <value>三国</value> </util:list> <bean id="test" class="com.study.day02.UtilTest"> <property name="list" ref="bookList"></property> </bean> </beans>
6、利用注解
针对Bean管理有如下几个注解
1)@Component 普通用法
2)@Service 用于service业务逻辑层
3)@Controller 用于web层
4)@Repository 用于DAO持久层
base-package为扫描此包下的注解
<?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:util="http://www.springframework.org/schema/util" 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/util http://www.springframework.org/schema/util/spring-util.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
<context:component-scan base-package="com.study.day04"></context:component-scan>
</beans>
一般来说注解中的value属性默认为类名的首字母小写,@Autowired:根据属性类型进行自动装配,@Qualifier:根据属性名称进行注入,@Resource:可以根据类型注入,可以根据名称注入
@Repository public class Dao { void add() { System.out.println("add ..."); } } @Service public class ServiceImp { @Autowired @Qualifier(value = "dao") private Dao dao; void add() { dao.add(); } @Test public void test() { ApplicationContext context = new ClassPathXmlApplicationContext("bean.xml"); ServiceImp serviceImp = context.getBean("serviceImp", ServiceImp.class); serviceImp.add(); } }
以上是本人短暂学习过程中对于IOC理解,由于本人能力有限,若存在不足的地方,还望指正
浙公网安备 33010602011771号