spring之IOC学习笔记
一、IOC(控制反转)
软件开发原则:高内聚,低耦合。
有一个A功能需要实现
高内聚:现在在一个B类中就能完成A功能,现在B类就是内聚
低耦合:现在需要C类和D类一起才能完成A功能,现在C类和D类就是耦合的(通俗的来讲就是C类和D类存在依赖关系)
在软件开发中我们需要,尽量降低耦合度,提高内聚。
====================================================================
例:
现在A类是依赖于B类的,当B类作出了修改,那么A类也会修改。在软件开发中要尽量减少这样的耦合度。
spring为我们提供的解决方案:xml+dom4j+反射+工厂
1.xml中配置类的完全限定名
2.dom4j解析xml
3.工厂中反射创建对象
新建一个maven项目,导入jar包:
<!-- https://mvnrepository.com/artifact/org.springframework/spring-context -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.1.1.RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-test -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>5.1.1.RELEASE</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
- 属性注入即setter注入:
- 构造方法注入:
- 注解注入@autowired
1.新建一个类用于测试依赖注入:
2.在resources文件夹下面新建一个spring的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="cn.mesmile.test.User">
</bean>
</beans>
3.写一个测试类,测试依赖注入
解释:都是接口,Applicationcontext是BeanFactory的子接口,拥有更多的功能与方法
重点:Applicationcontext是在启动容器创建上下文环境的时候就创建 Bean对象(预先加载,迫切加载),而 BeanFactory是在使用的时候才进行对象的创建(懒加载)———————————->**在单例模式的时候有效**
在单例模式下:
Applicationcontext是在启动容器创建上下文环境的时候就创建 Bean对象(预先加载)
BeanFactory是在使用的时候才进行对象的创建Bean对象(懒加载)
1.单个Bean对象懒加载
配置懒加载后,applicationContext对于这个对象就不是预先加载了。
2.spring中所有bean对象全部懒加【配置文件的根对象中添加efault-lazy-init为true】
注入方式二:静态工厂注入
方式三:实例工厂注入
修改spring配置文件
方式四:配置类的初始化方法,和销毁方法
方式五:构造方法注入 (创建对象的同时,赋值)
修改配置spring文件:
方式六:构造方法中传入的参数是对象
方式七:setter方法注入
===============================================================
BeanFatory:用于创建我们在xml中不能直接配置的对象
新建一个类:
public class MyEntityManagerFactory {
// 假设我们需要得到这个类的对象,但是不能够在xml中直接配置
}
新建一个类:
public class MyPersist {
// 这个类中的这个方法,用于返回获得我们需要获得的对象
public static MyEntityManagerFactory creteMyEntityManagerFactory(){
return new MyEntityManagerFactory();
}
}
新建一个类,实现BeanFactory接口:
/**
*
* 这个类实现FactoryBane这个类,并且传入需要返回的类
*/
public class MyFactoryBean implements FactoryBean<MyEntityManagerFactory>{
/**
* @return 返回需要返回的对象
* @throws Exception
*/
@Override
public MyEntityManagerFactory getObject() throws Exception {
return MyPersist.creteMyEntityManagerFactory();
}
/**
* @return 返回的对象是什么类型
*/
@Override
public Class<?> getObjectType() {
return MyEntityManagerFactory.class;
}
/**
* @return 返回的对象是否是单例
*/
@Override
public boolean isSingleton() {
return false;
}
}
在resources文件夹下新建一个spring配置文件:springContext-factory.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"
>
<!--
会调用 FactoryBean 的getObject方法,返回我们需要的对象
-->
<bean id="factory" class="cn.mesmile.factory.MyFactoryBean">
</bean>
</beans>
测试:
二、spring中bean的作用域
默认的配置中 scope=“singleton” ,单例的对象存在线程安全问题。
还没有评论,来说两句吧...