Spring的俩大核心实现:IOC和AOP
前言
框架的本质就是为了简化开发,IOC很大程度上证明了这一真理
IOC容器
1. IOC(Inversion Of Control)
-
控制反转
- 把创建对象和对象间的调用全部交给spring的ioc容器进行管理(Bean标签)
- 不需要手动创建对象和手动调用方法,减低了代码的耦合度
- 程序------高内聚,低耦合
-
使用IOC的目的:降低耦合度
-
java----》new
------改变地址就得重新编译运行,消耗成本高
-
2. IOC底层原理
-
xml解
解析配置文件中配置的对象
-
工厂模式
不在本类中直接通过new关键字创建对象,
而是通过工厂类中的静态方法创建对象,
然后进行返回,目的是降低耦合度
-
反射
通过反射创建对象,降低耦合度
3. IOC的实现
-
IOC思想基于IOC容器完成,IOC容器底层就是对象工厂
简单理解,IOC容器就是用来存放对象
IOC容器会把对象封装成一个又一个的Bean
-
Spring提供IOC容器实现的两种方式
- 二者创建对象的时期不同,功能不同
- BeanFactory:
- IOC容器的基本实现,是Spring内部使用的接口,不提供给开发人员
使用加载配置文件的时候,不创建对象,获取对象的时候才创建对象
- ApplicationContext:
- BeanFactory接口的子接口,提供更多更强大的功能,一般提供给开
发人员使用,加载配置文件的时候就会创建相应的对象
4. Bean管理
-
概述
-
在Spring中,对象被封装成了Bean
-
Bean管理包括俩个操作:**创建对象 **和 注入属性
-
-
基于XML文件的方式
-
创建对象
- bean标签,添加属性(id—对象名,class–全类名),默认调用无参构造方法
-
注入属性
DI:依赖注入
(1)set方法
property标签----name 属性名称,value属性值
(2)有参构造
bean标签—constructor-org标签 name value属性
(3)p名称注入
-
//添加名称空间
xmlns:p="http://www.springframework.org/school/p"
使用名称空间:<bean id="book" class="全类名" p:name="属性名" p:value="属性值"></bean>
(4)注入空值
使用null标签
(5)注入特殊符号
实体符号
cdate使用在value标签内部
<![CDATE[<<>>]]>
-
注入对象
-
按书写bean的位置分:
-
外部bean:
property标签的属性ref
-
-
内部bean:
对象作为类的属性,在property标签内部嵌套bean标签
级联赋值:
同时向多个关联的类中的属性进行赋值内部bean和外部bean
mp.ename,需要提供get方法
注入集合类型属性
- 在property标签内部嵌套下面标签,来实现
array-----value
list------value
set------value
map----key / value
-
往集合中注入对象
利用ref标签的bean属性------填写id值 -
将往集合注入属性的操作进行提取
-
使用util名称空间
-
<util:list id=“bookList”>
-
Spring中的两种bean:
普通Bean
xml文件中定义的类型与ioc容器返回的类型一致
工厂Bean(FactoryBean)
-
xml配置文件中定义的类型可以与返回的类型不一致
- Bean的作用域(scope)
俩个:单实例和多实例
默认单实例:singleton
-
加载配置文件的时候,就会创建对象
- 多实例:prototype
不是在加载配置文件的时候创建对象
而是在获取对象getBean方法的时候创建对象
-
Bean的生命周期:
-
Bean指的就是对象,所以Bean的生命周期就是从对象创建到对象销毁的过程
-
Bean生命周期
- 需要在Bean标签中进行配置:初始化方法 / 销毁方法
<bean id="book" class="com.nuesoft.springdemo2.Book" init-method="innitMethod" destroy-method="destroyMethod"> <property name="bname" value="九阳真经"></property> </bean>
-
通过构造器创建Bean实例
-
为Bean的属性赋值
-
调用Bean的初始化方法
-
使用Bean(获取对象)
-
当容器关闭时,调用Bean的销毁方法
-
Bean的后置处理器
- 配置后置处理器,在执初始化方法的前后执行
- 写一个后置处理器的类,实现BeanPostProcessor接口,重写接口中的抽象方法
-
public class MyBeanPost implements BeanPostProcessor {
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
System.out.println("在初始化之后执行的方法");
return BeanPostProcessor.super.postProcessAfterInitialization(bean, beanName);
}
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
System.out.println("在初始化之前执行的方法");
return BeanPostProcessor.super.postProcessBeforeInitialization(bean, beanName);
}
}
```
- 在核心配置文件中配置后置处理器
```xml
</bean>
<bean id="mybean" class="com.nuesoft.springdemo2.MyBeanPost"></bean>
</beans>
```
4. Bean的**自动装配**
- Bean标签的属性autowried
```xml
<bean id="emp" class="com.nuesoft.springdemo2.Emp" autowire="byType">
</bean>
(1)根据名称注入属性
byName
(2)根据类型注入属性
byType
不推荐使用,同一个类型的属性可能会有多个,
此时就不知道拿哪一个给他赋值
(3)引入外部配置文件
-
编写外部属性文件
-
利用名称空间context
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.springframework.org/schema/beans" 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/context http://www.springframework.org/schema/context/spring-context.xsd ">
value属性值用表达式:${}
-
外部属性文件,用键值对表示
-
基于注解实现bean管理
-
什么是注解:
(1) 注解是代码的特殊标记,格式:@注解名称(属性名称=属性值,…)
(2) 作用域:类上面、方法上面、属性上面
(3) 目的:简化XML操作 -
Spring针对Bean管理中创建对象提供的注解
@Component----普通类
@Service-------业务逻辑层
@Controller-------控制层
@Repository------dao层
四个注解功能相同,都是用来创建bean对象 标识不同的类
需要开启组件扫描
-
指定扫描的内容用centext名称空间来实现
-
扫描的内容
use-default-filter=“false”
context:include-filter -
不扫描的内容
context:exclude-filter
-
-
用注解方式注入属性
@Autowired:根据属性类型进行自动装配
@Qualifier:根据属性名称进行注入,要和@Autowired一起使用
@Resource:既可以根据属性类型又可以根据名称注入
@Value:注入普通类型属性 -
完全注解开发—基于SpringBoot
- 用配置类替代配置文件
- @ComponentScan(basePackages={“”,“”})开启组件扫描
- @Configuration—作为配置类
- 测试类:
- 加载配置类:AnnotationConfigApplicationContext(Xxx.class)
-