Java主流框架
1.Spring IOC
IOC与DI的理解
一:IOC控制反转(宏观方面-设计理念)
1、IOC控制反转全称Inverse of Control,是一种设计理念,是宏观方面的
2、由第三方来管理和控制对象
3、IOC根本目的:降低对象之间直接耦合
二:DI依赖注入(是IOC理念的技术实现)
1、IOC是一种设计理念,是现代程序设计遵循的标准,是宏观目标
2、DI是一种具体技术实现,是微观实现,是对宏观的IOC理念的一种技术上诠释
3、DI在Spring中利用反射技术和工厂模式实现对象注入
&&原始的创建对象
IDAO dao = new UserDAO();
&&DI(IOC)创建对象
//在运行时applicationContext对象创建userDAO类
IDAO dao = (DAO)applicationContext.getBean("userDAO");
<bean id="userDAO" class="com.imooc.dao.UserDAO"/>
<bean id="userDAO" class="com.imooc.dao.UserExtDAO"/>
Spring Bean实例化对象的三种形式
1、基于构造方法实例化对象
2、基于静态工厂实例对象
3、基于工厂实例方法实例化对象
…
一:基于构造方法实例化对象
1、Apple实体类
public class Apple {
public String title;
public String color;
public String origin;
public Float price;
// .... getter和setter、无参构造方法、有参构造方法
}
2、applicationContext.xml配置Bean指向Apple,通过bean标签对象实例化
<!--构造函数实例化-->
**<!--使用无参构造方法实例化对象-->**
<bean id="apple1" class="com.imooc.spring.ioc.entity.Apple">
</bean>
**<!--使用带参构造方法实例化对象-->**
<bean id="apple2" class="com.imooc.spring.ioc.entity.Apple">
<constructor-arg name="title" value="红富士"/>
<constructor-arg name="color" value="红色"/>
<constructor-arg name="origin" value="欧洲"/>
<constructor-arg name="price" value="19.8"/>
</bean>
3、创建IOC容器
//1.创建context对象,而其对象本身就带有Spring IOC容器,classpath当前类路径下
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("classpath:applicationContext.xml");
//2.从IoC容器中提取beadId对象
Apple apple3 = context.getBean("apple3", Apple.class);
System.out.println(apple3.getTitle());
二:基于静态工厂实例对象
1、AppleStaticFactory类
/**
* 静态工厂通过静态方法创建对象,
隐藏创建对象的细节
*/
public class AppleStaticFactory {
/**
* spring如何通过AppleStaticFactory
静态工厂调用createSweetApple方法
*/
public static Apple createSweetApple(){
Apple apple = new Apple();
apple.setTitle("红富士");
apple.setOrigin("欧洲");
apple.setColor("红色");
return apple;
}
}
2、applicationContext.xml配置Bean指向AppleStaticFactory,通过bean标签对象实例化
<!--利用静态工厂实例化对象-->
<bean id="apple4" class="com.imooc.spring.ioc.factory.AppleStaticFactory" factory-method="createSweetApple"/>
3、创建IOC容器
//1.创建context对象,而其对象本身就带有Spring IOC容器,classpath当前类路径下
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("classpath:applicationContext.xml");
//2.从IoC容器中提取beadId对象
Apple apple3 = context.getBean("apple3", Apple.class);
System.out.println(apple3.getTitle());
三:基于工厂实例方法实例化对象
1、AppleFactoryInstance 工厂实例
/**
* 工厂实例方法创建对象是指IOC容器对工厂类进行实例化
* 并调用对应的实例方法创建对象的过程
*/
public class AppleFactoryInstance {
/**
* createSweetApple 是属于AppleFactoryInstance工厂对象的,
* 而不是属于工厂类的
* @return
*/
public Apple createSweetApple(){
Apple apple = new Apple();
apple.setTitle("红富士1");
apple.setOrigin("欧洲");
apple.setColor("红色");
return apple;
}
}
2、applicationContext.xml配置Bean指向AppleFactoryInstance,通过bean标签对象实例化
<!--利用工厂实例化对象-->
<bean id="factoryInstance" class="com.imooc.spring.ioc.factory.AppleFactoryInstance"/>
<bean id="apple5" factory-bean="factoryInstance" factory-method="createSweetApple"/>
3、创建IOC容器
//1.创建context对象,而其对象本身就带有Spring IOC容器,classpath当前类路径下
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("classpath:applicationContext.xml");
//2.从IoC容器中提取beadId对象
Apple apple3 = context.getBean("apple3", Apple.class);
System.out.println(apple3.getTitle());
谈谈Spring Bean的生命周期和作用域?
Spring Bean 生命周期比较复杂,可以分为创建和销毁两个过程。
一:首先,创建 Bean 会经过一系列的步骤,主要包括:
1、实例化 Bean 对象。
2、设置 Bean 属性。
3、如果我们通过各种 Aware 接口声明了依赖关系,则会注入 Bean 对容器基础设施层面的依赖。具体包括 BeanNameAware、BeanFactoryAware 和 ApplicationContextAware,分别会注入 Bean ID、Bean Factory 或者 ApplicationContext。
4、调用 BeanPostProcessor 的前置初始化方法 postProcessBeforeInitialization。
5、如果实现了 InitializingBean 接口,则会调用 afterPropertiesSet 方法。
6、调用 Bean 自身定义的 init 方法。调用 BeanPostProcessor 的后置初始化方法 postProcessAfterInitialization。
7、创建过程完毕。
如下图:
二:Spring Bean 的销毁过程会依次调用 DisposableBean 的 destroy 方法和 Bean 自身定制的 destroy 方法。
Spring Bean 有五个作用域,其中最基础的有下面两种:
1、Singleton,这是 Spring 的默认作用域,也就是为每个 IOC 容器创建唯一的一个 Bean 实例。
2、Prototype,针对每个 getBean 请求,容器都会单独创建一个 Bean 实例。
从 Bean 的特点来看,Prototype 适合有状态的 Bean,而 Singleton 则更适合无状态的情况。
另外,使用 Prototype 作用域需要经过仔细思考,毕竟频繁创建和销毁 Bean 是有明显开销的。
如果是 Web 容器,则支持另外三种作用域:
1、Request,为每个 HTTP 请求创建单独的 Bean 实例。
2、Session,很显然 Bean 实例的作用域是 Session 范围。
3、GlobalSession,用于 Portlet 容器,因为每个 Portlet 有单独的 Session,GlobalSession 提供一个全局性的 HTTP Session。
知识扩展
一:Spring 的基础机制
1、控制反转(Inversion of Control),或者也叫依赖注入(Dependency Injection),广泛应用于 Spring 框架之中,可以有效地改善了模块之间的紧耦合问题。
从 Bean 创建过程可以看到,它的依赖关系都是由容器负责注入,具体实现方式包括带参数的构造函数、setter 方法或者AutoWired方式实现。
2、AOP这种切面编程机制,Spring 框架中的事务、安全、日志等功能都依赖于 AOP 技术。
Spring AOP (Aspect Orient Programming),直译过来就是 面向切面编程。
AOP的做法是将通用、与业务无关的功能抽象封装为 切面类。
切面可配置在目标方法的执行前、后运行,真正做到即插即用。
AOP的最终目的:在不修改源码的情况下对程序行为进行扩展。
Spring的IOC四种注入方式
一:setter注入
二:构造器注入
即通过构造函数完成依赖关系的设定。
三:注解注入
即通过注解方式完成依赖关系的设定
@Resource先会按照名称到spring容器中查找,如果查找不到,就回退按照类型匹配,如果再没有匹配到,就会抛出异常。如果在开发的时候,建议大家都是用@Resource(name=”us