IoC控制反转
一、IoC概念和原理
1. 什么是IoC
(1) 控制反转:把对象创建和对象之间的调用过程,交给Spring进行管理。
(2)使用IoC目的:降低耦合性
2. IoC底层原理
(1)xml解析、工厂模式、反射
二、IoC过程
1. xml配置文件,配置创建的对象
<!--配置创建的对象-->
<bean id="dao" class="com.jxk.UerDao"></bean>
2. 有UserService和UserDao类,创建工厂类
class UserFactory{
public static UserDao getDao(){
String classValue = class属性值;//1.xml解析
Class clazz = Class.forName(classValue);//2.通过反射创建对象
return (UserDao)clazz.newInstance();
}
}
三、IoC接口
1. IoC思想基于IoC容器完成,IoC容器底层就是Bean工厂
2. Spring提供实现IoC容器的两种方式(两个接口)
1)BeanFactory :IoC容器基本实现,是Spring内部使用的接口,不提供开发人员使用。
BeanFactory加载配置文件时不创建对象,在获取对象(使用)时才创建
2)ApplicationContext :实际是BeanFactory的子接口,提供更强大的功能,提供给开发人员使用。
ApplicationContext加载配置文件时就创建对象
3. ApplicationContext接口的实现类
四、IoC操作
1.Bean管理
0)什么是Bean管理:Bean管理指的是两个操作
1)Spring创建对象
2)Spring注入属性
2. Bean管理操作的两种方式
1)基于xml配置文件实现
2)基于注解方式实现
3. IoC操作Bean管理(基于xml方式实现)
基于xml方式创建对象
<!--配置创建的对象-->
<bean id="user" class="com.jxk.UserDao"></bean>
1) 在Spring配置文件中,使用bean标签,标签里面添加对应属性,就可以实现对象创建。
2) 常用属性:
id:唯一标识
class:类全路径(包类名)
3) 创建对象时,默认调用无参构造函数进行创建
基于xml方式注入属性
DI:依赖注入,就是注入属性
第一种注入方式:set方法
首先创建类,定义属性和对应的set方法
然后在Spring配置文件中配置创建对象配置属性注入(基于set方法)
第二种注入方式:使用有参构造函数
首先创建类,定义属性并生成相应的有参构造函数:
/**
* 使用有参构造注入属性
*/
public class Orders {
//定义属性
private String oname;
private String address;
//生成有参构造函数
public Orders(String oname, String address) {
this.oname = oname;
this.address = address;
}
//测试函数
public void OrdersTest(){
System.out.println(oname+"::"+address);
}
}
然后在Spring的xml配置文件中注入属性(有参构造方法)
<!-- 使用有参构造函数注入属性 -->
<bean id="orders" class="com.jxk.Spring5.Orders">
<constructor-arg name="oname" value="电脑"></constructor-arg>
<constructor-arg name="address" value="China"></constructor-arg>
</bean>
bean作用域
在Spring里,可以设置创建的实例是单实例还是多实例。
scope属性值:第一个值 默认值,singleton,表示单实例对象;第二个值 prototype 表示多实例对象。
singleton和prototype区别:
singleton:加载配置文件时就会创建单实例对象
prototype:在调用getBean方法时创建多实例对象。
request
session
bean生命周期
- 无参构造器创建bean实例
- 使用类中的set方法设置属性值和对其他bean引用
- 把bean实例传递bean后置处理器的方法postProcessBeforeInitialization
- 调用bean的初始化方法(需要进行配置初始化的方法InitMethod)
- 把bean实例传递bean后置处理器的方法postProcessAfterInitialization
- bean可以使用了(获取到创建的对象之后)
- 当容器关闭的时候,调用bean的销毁的方法(需要进行配置销毁的方法DestroyMethod)
xml自动装配
- 什么是自动装配?根据指定装配规则(属性名称或者属性类型),Spring自动将匹配的属性值进行注入
- 实现自动装配:
bean标签属性autowire,配置自动装配
autowire属性常用两个值:byName,byType
外部属性文件
第一种方法: 直接配置连接池
第二种方法:引入外部属性文件配置数据库连接池(1. 创建外部属性文件,properties格式文件,写数据库信息;2. 把外部properties属性文件引入到Spring配置文件中,即引入context标签,然后使用标签引入外部属性文件)
4. IoC操作Bean管理(FactoryBean)
- Spring有两种类型bean,一种普通bean,另外一种工厂bean
- 普通bean:在配置文件中定义bean类型就是返回类型
- 工厂bean:在配置文件中定义bean类型可以和返回类型不同
第一步:创建类,让这个类作为工厂bean,实现接口FatoryBean
第二步:实现接口里面的方法,在实现的方法中定义返回的bean类型
5. IoC操作Bean管理(基于注解方式)
- 什么是注解?
注解是代码的特殊标记,格式:@注解名称(属性名称=属性值,属性名称=属性值)
使用注解,作用在类、方法、属性上面
目的:简化xml配置 - Spring针对Bean管理中创建对象提供注解
(1)@Component
(2)@Service
(3)@Controller
(4)@repository - 提供注解步骤
1)引入AOP依赖 jar包
2)开启组件扫描:如果扫描多个包,多个包使用逗号隔开;
<context:component-scan base-package="com.jxk"></context:component-scan>
3)创建类,在类上卖弄添加创建对象注解
//在注解里面value属性值可以省略不写
//默认值是类名称,首字母小写
4. 开启组件扫描细节配置(include、exclude)
5. 基于注解方式实现属性的注入
(1)@Autowired:根据属性类型进行自动装配
(2)@Qualifier:根据属性名称进行注入(与Autowired一起使用)
(3)@Resource :可以根据类型注入,可以根据名称注入
(4)@Value:注入普通类型
6. 完全注解开发步骤
1)创建配置类,替代xml配置文件
@Configuration//作为配置类,替代xml文件
@ComponentScan(basePackages={"com.jxk"})
2)编写测试类
//1. 加载配置类
ApplicationContext context = new AnnotationConfigApplicationContext(SpringConfig.class);
//2. 获取配置创建的对象
UserService userService = context.getBean("userService",UserService.class);
userService.add();