SPRING
一、依赖注入(IOC)
1.什么是依赖注入
(1)我们经常说的控制反转(Inversion of Control —IOC)和依赖注入(Dependency Injection—DI),在Spring 环境下是等同的概念。
(2)控制反转是通过依赖注入实现的。
(3)所谓依赖注入指的是容器负责创建对象和维护对象间的依赖关系。而不是通过对象本身负责自己的创建和解决自己的依赖。
2.本质:
创建应用对象之间协作关系(依赖)的行为通常称为装配。这也是依赖注入的本质。
3.依赖注入主要目的
依赖注入的主要目的是解耦,即降低耦合性。
4.两种Spring容器
Spring自带了多个容器实现,可以归为两种不同类型:
(1)bean工厂
(由BeanFactory接口定义)
是最简单的容器,提供基本的DI支持。(低级封装,功能一般)
(2)应用上下文
(由ApplicationContext接口定义)
基于BeanFactory构建,并提供应用框架级别的服务。(高度封装,功能强大,推荐使用)
5.使用Spring应用上下文
Spring自带了多种类型的应用上下文。
1 | ⭐AnnotationConfigApplicationContext | 从一个或多个基于Java的配置类中加载Spirng应用上下文 |
---|---|---|
2 | AnnotationConfigWebApplicationContext | 从一个或多个基于Java的配置类中加载Spring Web应用上下文。 |
3 | ⭐ClassPathXmlApplicationContext | 从类路径下的一个或多个XMl配置文件中加载上下文定义,把应用上下文的定义文件作为资源 |
4 | ⭐FileSystemXmlApplicationContext | 从文件系统下的一个或多个XML配置文件中加载上下文定义 |
5 | XmlWebApplicationContext | 从Web应用下的一个或多个XMl配置文件中加载上下文定义 |
5.1 从Java配置中加载上下文(.class文件)
//1.从Java配置中加载配置,将Bean装载到应用上下文。
ApplicationContext context=new AnnotationConfigApplicationContext(com.springaction.knights.config.KnightConfig.class);
示例:
public void launchByAnnotationConfigApplicationContext(){
// 使用AnnotationConfigApplicationContext来配置Bean
ApplicationContext applicationContext = new AnnotationConfigApplicationContext(Bean_dog.class,BeanConfiguration.class);
// 装配bean中的对象
Dog dog = applicationContext.getBean(Dog.class);
Person person = applicationContext.getBean(Person.class);
System.out.println(dog.getName());
System.out.println(person);
// 返回对于指定类型Bean(包括子类)的所有名字
String[] namesForType = applicationContext.getBeanNamesForType(Dog.class);
for (String name : namesForType) {
System.out.println(name);
}
}
5.2 从类路径加载上下文(xml文件)
//1.从类路径下读取配置文件,将Bean装载到应用上下文。
ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");
示例:
public void launchByClassPathXmlApplicationContext(){
// 使用ClassPathXmlApplicationContext来配置bean
ApplicationContext ac = new ClassPathXmlApplicationContext("beans.xml");
// 装配bean中的对象
Person person = (Person)ac.getBean("person");
System.out.println(person);
}
5.3 从文件系统加载上下文(xml文件)
//1.从文件系统读取配置文件,将Bean装载到应用上下文。
ApplicationContext context=new FileSystemXmlApplicationContext("D:/applicationContext.xml");
示例
public void launchByFileSystemXmlApplicationContext(){
// 使用ClassPathResource来配置bean
ApplicationContext ac = new FileSystemXmlApplicationContext("D:\\git-workspace\\ssm-in-action\\spring-in-action\\src\\main\\resources\\beans.xml");
// 装配bean中的对象
Person person = (Person)ac.getBean("person");
System.out.println(person);
}
⭐ 5.4 从BeanFactory加载(xml文件)
//从类路径下读取配置文件
BeanFactory beanFactory = new XmlBeanFactory(new ClassPathResource("beans.xml"));
示例
public void launchByBeanFactory(){
// 使用ClassPathResource来读取配置文件
BeanFactory beanFactory = new XmlBeanFactory(new ClassPathResource("beans.xml"));
Dog bean = (Dog) beanFactory.getBean("dog");
System.out.println(bean.getName()+bean.getAge());
}
应用上下文准备就绪之后,我们就可以调用上下文的getBean()方法从Spring容器中获取bean.
5.5 使用@Autowired进行自动装配
@Autowired
User user;
使用**@Autowired** 时需要使用**@Component**来对应
@Component
public class User {
private Long id;
private String name;
private Integer age;
}
6. IOC容器(Bean)的生命周期
- 通过构造器或工厂方法创建 Bean 实例
- 为 Bean 的属性设置值和对其他 Bean 的引用
- 将 Bean 实例传递给 Bean 后置处理器的 postProcessBeforeInitialization 方法
- 调用 Bean 的初始化方法
- 将 Bean 实例传递给 Bean 后置处理器的 postProcessAfterInitializatio方法
- Bean 可以使用了
- 当容器关闭时, 调用 Bean 的销毁方法
在 Bean 的声明里设置 init-method 和 destroy-method 属性, 为 Bean 指定初始化和销毁方法.
<!-- 配置相应的 Bean 后置处理器 class:对应Bean后置处理器的全类名-->
<bean class="com.nchu.Processer.MypostProcesser"></bean>
public class MypostProcesser implements BeanPostProcessor {
@Override
// 初始化之前的方法
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
// 可以直接对bean进行修改 或 替换
Son son = new Son();
if("son".equals(beanName)){
son.setSex("女");
System.out.println("before");
return son;
}
return bean;
}
@Override
// 初始化之后的方法 Object:bean对象、String:bean的id
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
//后置处理器会对每一个
// 可以只针对某个bean进行处理
if("student".equals(beanName))
System.out.println("after"+" "+beanName);
return bean;
}
}