spring ioc 笔记

Spring框架是企业级开发的标准,基于IOC和AOP,提供全面的解决方案。其核心容器管理bean,AOP支持切面编程,数据访问模块包括JDBC和ORM集成。Web模块包含SpringMVC,Test模块方便测试。bean生命周期涉及初始化和销毁方法,扩展点如BeanFactoryPostProcessor和BeanPostProcessor。此外,还介绍了延迟加载和FactoryBean的概念。

spring

spring是分层全栈轻量级开源框架。以IOC和AOP为内核,提供/整合了全套的企业级开发框架,已经是事实上的企业级开发标准。

架构

在这里插入图片描述

  • Spring核⼼容器(Core Container) 容器是Spring框架最核⼼的部分,它管理着Spring应⽤中bean的创建、配置和管理。在该模块中,包括了Spring bean⼯⼚,它为Spring提供了DI的功能。基于bean⼯⼚,我们还会发现有多种Spring应⽤上下⽂的实现。所有的Spring模块都构建于核⼼容器之上。
  • ⾯向切⾯编程(AOP) /Aspects Spring对⾯向切⾯编程提供了丰富的⽀持。这个模块是Spring应⽤系统中开发切⾯的基础,与DI⼀样, AOP可以帮助应⽤对象解耦。
  • 数据访问与集成(Data Access/Integration)Spring的JDBC和DAO模块封装了⼤量样板代码,这样可以使得数据库代码变得简洁,也可以更专注于我们的业务,还可以避免数据库资源释放失败⽽引起的问题。 另外, Spring AOP为数据访问提供了事务管理服务,同时Spring还对ORM进⾏了集成,如Hibernate、 MyBatis等。该模块由JDBC、 Transactions、 ORM、 OXM 和 JMS 等模块组成。
  • Web 该模块提供了SpringMVC框架给Web应⽤,还提供了多种构建和其它应⽤交互的远程调⽤⽅案。 SpringMVC框架在Web层提升了应⽤的松耦合⽔平。
  • Test 为了使得开发者能够很⽅便的进⾏测试, Spring提供了测试模块以致⼒于Spring应⽤的测试。 通过该模块, Spring为使⽤Servlet、 JNDI等编写单元测试提供了⼀系列的mock对象实现。

IOC

思想

IOC:控制反转 又叫做 DI:依赖注入
控制反转:原来的是由调用方控制被调用方的实例化过程,现在由容器控制
依赖注入:容器将调用对象所依赖(调用)的对象 注入到调用对象中

BeanFactory与ApplicationContext

  • ApplicationContext是BeanFactory子接口
  • BeanFactory bean工厂,是IOC容器,只有bean相关的操作。
  • ApplicationContext应用上下文,比BeanFactory多了国际化和资源访问等的功能

启动IOC容器

java

  • ClassPathXmlApplicationContext:从类的根路径下加载配置⽂件(推荐使⽤)
  • FileSystemXmlApplicationContext:从磁盘路径上加载配置⽂件
  • AnnotationConfigApplicationContext:纯注解模式下启动Spring容器

web

  • xml
  • 配置类

bean的生命周期

  • 单例:默认
  • 原型,多例

bean的实例化方式

  • 构造器注入
  • 静态工厂注入
  • 实例工厂注入
  • setter方法注入
  • FactoryBean

注解+xml方式

注解配置本系统或者业务相关的依赖关系
xml中配置spring的通用的配置,比如包扫描路径,数据库连接池,事务管理器等。

注解

@Component @Controller @Service @Repository
@Scope(“prototype”),默认单例,注解加在类上
@Autowired spring的注解,按类型装配依赖对象,如果按名称装配,需要结合Qualifier
@Qualifier(name=“jdbcAccountDaoImpl”)
@Resource j2ee,默认按名称装配,如果没指定,取字段名字。也可以指定类型。
@PostConstruct,注解加在⽅法上,该⽅法就是初始化后调⽤的⽅法
@PreDestory,注解加在⽅法上,该⽅法就是销毁前调⽤的⽅法
@Configuration 注解,表名当前类是⼀个配置类
@ComponentScan 注解,替代 context:component-scan
@PropertySource,引⼊外部属性配置⽂件
@Import 引⼊其他配置类
@Value 对变量赋值,可以直接赋值,也可以使⽤ ${} 读取资源配置⽂件中的信息
@Bean 将⽅法返回对象加⼊ SpringIOC 容器

具体都有哪些事情

  • Bean容器找到配置文件中 Spring Bean 的定义。
  • Bean容器利用Java Reflection API创建一个Bean的实例。
  • 如果涉及到一些属性值 利用set方法设置一些属性值。
  • 如果Bean实现了BeanNameAware接口,调用setBeanName()方法,传入Bean的名字。
  • 如果Bean实现了BeanClassLoaderAware接口,调用setBeanClassLoader()方法,传入ClassLoader对象的实例。
  • 如果Bean实现了BeanFactoryAware接口,调用setBeanClassLoader()方法,传入ClassLoader对象的实例。
  • 与上面的类似,如果实现了其他*Aware接口,就调用相应的方法。
  • 如果有和加载这个Bean的Spring容器相关的BeanPostProcessor对象,执行postProcessBeforeInitialization()方法
  • 如果Bean实现了InitializingBean接口,执行afterPropertiesSet()方法。
  • 如果Bean在配置文件中的定义包含init-method属性,执行指定的方法。
  • 如果有和加载这个Bean的Spring容器相关的BeanPostProcessor对象,执行postProcessAfterInitialization()方法
  • 当要销毁Bean的时候,如果Bean实现了DisposableBean接口,执行destroy()方法。
  • 当要销毁Bean的时候,如果Bean在配置文件中的定义包含destroy-method属性,执行指定的方法。

常用扩展点

后置处理器

BeanFactoryPostProcessor:bean工厂级
BeanPostProcessor:bean级

// BeanFactory后置处理器
public class MyBeanFactoryPostProcessor implements BeanFactoryPostProcessor {

	public MyBeanFactoryPostProcessor() {
		System.out.println("BeanFactoryPostProcessor的实现类构造函数...");
	}

	@Override
	public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
		System.out.println("BeanFactoryPostProcessor的实现方法调用中......");
	}
}

// Bean后置处理器
public class MyBeanPostProcessor implements BeanPostProcessor {

	public MyBeanPostProcessor() {
		System.out.println("BeanPostProcessor 实现类构造函数...");
	}

	@Override
	public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
		if("lagouBean".equals(beanName)) {
			System.out.println("BeanPostProcessor 实现类 postProcessBeforeInitialization 方法被调用中......");
		}
		return bean;
	}

	@Override
	public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
		if("lagouBean".equals(beanName)) {
			System.out.println("BeanPostProcessor 实现类 postProcessAfterInitialization 方法被调用中......");
		}
		return bean;
	}
}

// Bean set注入后的
public class LagouBean implements InitializingBean, ApplicationContextAware {

	private ItBean itBean;

	public void setItBean(ItBean itBean) {
		this.itBean = itBean;
	}

	public LagouBean(){
		System.out.println("LagouBean 构造器...");
	}


	/**
	 * InitializingBean 接口实现
	 */
	public void afterPropertiesSet() throws Exception {
		System.out.println("LagouBean afterPropertiesSet...");
	}

	public void print() {
		System.out.println("print方法业务逻辑执行");
	}

	@Override
	public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
		System.out.println("setApplicationContext....");
	}
}

延时加载

ApplicationContext 容器的默认⾏为是在启动服务器时将所有 singleton bean 提前进⾏实例化。提前实例化意味着作为初始化过程的⼀部分, ApplicationContext 实例会创建并配置所有的singletonbean。
如果bean1依赖了bean2,只有bean2配置了延迟加载,那么因为容器启动需要初始化bean1,初始化bean1又需要初始化bean2,bean2也会在容器启动时创建。
开启延迟加载可以提高容器的启动速度

FactoryBean

  • FactoryBean是一个接口
  • 继承FactoryBean的类则是一个bean,也会受到BeanFactory的管理
  • 这个FactoryBean有点特殊,类似于工厂模式,将bean的创建过程交给开发,用于实现一些复杂bean的实例化
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值