Spring
IoC
1.IoC概念 (”Inversion of Control“)
-
实现方法:
- 依赖注入 (”Dependency Injection“,简称 ”DI“)
- 依赖查找 (”Dependency Lookup“)
-
控制反转:
- 把对象创建和对象之间的调用过程,交给Spring进行管理
- 使用IoC的目的:为了降低耦合度
-
配置
<bean id="user" class="com.java.spring5.User"></bean>
- 调用
@Test
public void userText() {
//加载Spring配置文件
ApplicationContext/(BeanFactory)(两者都行) context = new ClassPathXmlApplicationContext("bean1.xml");
//获取配置文件创建的对象
User user = context.getBean("user", User.class);
//调用对象方法
System.out.println(user);
user.方法();
}
-
底层原理
-
工厂模式 (在工厂类中进行如下操作)
- xml解析 (获取对象路径)
- 反射 (获取对象全类名)
< return (通过反射对象的方法创建对象并返回) >
-
-
IoC接口
-
IoC思想基于IoC容器完成,IoC容器底层就是对象工厂
-
Spring提供了IoC实现的两种方式:(两个接口)
-
BeanFactory
:Spring内部接口,不提供给开发人员使用< 懒加载(加载配置文件时不创建对象,调用时才创建)>
-
ApplicationContext
:BeanFactory
的子接口,提供更多更强大的功能,一般由开发人员使用< 饿加载(空间换时间)>
-
-
ApplicationContext接口实现类
FileSystemXmlApplicationContext
:绝对路径ClassPathXmlApplicationContext
:相对路径
-
-
IoC操作Bean管理
-
Bean管理
- Spring创建对象
- Spring注入属性
-
Bean管理操作的两种方式
- 基于xml配置文件
-
基于xml创建对象
<bean id="user" class="com.java.spring5.User"></bean>
(1)id属性:标识(别名)
(2)class属性:类全路径(包类路径)
(3)默认无参构造
-
基于xml注入属性
DI(依赖注入):
< set注入 & 构造注入 >
(1)set注入
<property name="name" value="Admin"></property>
(2)构造注入
<constructor-arg name="name" value="Admin"></constructor-arg>
- 基于注解
-
-
Bean & FactotyBean
- 普通Bean:配置文件中定义的Bean类型即返回类型
- 工厂Bean:配置文件中定义的Bean类型可以和返回类型不一样
- Spring内置Bean
- 实现接口
FactotyBean
-
Bean
-
Bean的作用域:在Spring中设置创建的Bean是单实例(默认)还是多实例
<bean id="user" class="com.java.spring5.User" scope="prototype/singleton(default)"></bean>
-
Bean的生命周期:
(1)通过构造器创建Bean实例(无参构造)
(2)为Bean的属性设置值和对其他Bean的引用(调用set方法)
(3)调用Bean的初始化方法(需配置)
(4)Bean可以使用了(对象获取到了)
(5)当容器关闭时,调用Bean的销毁方法(需配置),进行后置处理(调用后置处理器,实现
BeanPostProcessor
接口)
-
-
xml自动装配
-
根据指定装配规则(属性名称或类型),Spring自动将匹配的属性值进行注入
<bean id="user" class="com.java.spring5.User" autowire="byName/byType"></bean>
byName
:id必须和要注入的属性名一致byType
:id必须和要注入的属性类型一致
-
-
外部属性文件
- 创建properties文件
- 用xmln创建命名空间
- context标签引用properties文件全类名
- 作用:在多属性配置中节省大量property标签
2.IoC操作Bean管理(注解版)
-
创建对象
-
Spring基于Bean管理中创建对象提供了注解
-
@Component
(组件,用于创建对象) -
@Service
(service层) -
@Controller
(web层) -
@Repository
(dao层)< 以上四个注解功能一样,都可以用来创建Bean实例 >
-
-
步骤:
-
引入AOP的依赖(Maven引入Spring依赖是会间接引入必要的AOP依赖)
-
开启组件扫描(先添加命名空间)
<context:component-scan base-package="com.java.spring5"></context:component-scan>
< 扫描多个包用逗号隔开,或扫描包的上层目录 >
-
创建类,添加注解
< 注解中value不写默认类名首字母小写 >
-
-
-
组件扫描(通过自己配置实现灵活扫描)(略)
-
注入属性
-
Spring基于Bean管理中注入属性提供了注解
@AutoWired
(根据属性类型进行自动装配)@Qualifier
(根据属性名称进行注入)@Resource
(可以根据类型也可以根据名称)@Value
(注入基本类型属性)
-
步骤:
-
创建service和dao类,添加创建对象注解
-
在service中添加注解自动注入dao对象
<
@Qualifier
要和@AutoWired
一起用 >
-
-
-
纯注解开发
-
@Configuration
:将当前类作为配置类(Config类),替代xml配置文件 -
@ComponentScan
:组件扫描(basePackages = {“包类路径”}) -
加载配置类
ApplicationContext context = new AnnotationConfigApplicationContext(xxxConfig.class);
-