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

被折叠的 条评论
为什么被折叠?



