1.什么是Spring
Spring是一个轻量级Java开发框架,由Rod Johnson创建。根本使命是解决企业级应用开发的复杂性,简化Java开发。它有两个核心特征,控制反转(IoC)和面向切面编程(AOP)。
2. SpringIOC(工厂模式+反射)
控制反转,它把传统上由程序代码直接操控的对象调用权交给容器,通过容器来实现对对象组件的装配和管理。
3.IOC过程
1.读取bean的配置信息(从.xml文件,@configuration,@autowired)
2.根据bean的注册信息,实例化bean,并加载到spring容器中
3.要使用的时候进行调用,延时加载
4.BeanFactory和ApplicationContext
BeanFactory:是Spring中最底层的接口,包含了各种Bean的定义,读取bean配置文档,管理bean的加载、实例化,控制bean的生命周期,维护bean之间的依赖关系。延迟加载,使用时加载bean
ApplicationContext:它是BeanFactory的子接口,除了以上功能外,还继承了MessageSource,支持国际化,统一的资源文件访问方式,提供在监听器中注册bean的事件,能同时加载多个配置文件。在容器启动时就一次性加载了所有的bean
5.Bean的作用域
singleton:bean在Sring容器中只有一个实例
prototype:一个bean可以有多个实例
request:每次http请求都会创建一个bean,该作用域仅在基于web的Spring ApplicationContext情形下有效
session:在一个Http Session中,一个bean定义对应一个实例
global-session:在一个全局的Http Session中,一个bean对应一个实例
默认是singleton
6. Bean的生命周期
Spring对bean进行实例化;
Spring将值和bean的引用注入到bean对应的属性中;
如果bean实现了BeanNameAware接口,Spring将bean的ID传递给setBean-Name()方法;
如果bean实现了BeanFactoryAware接口,Spring将调用setBeanFactory()方法,将BeanFactory容器实例传入;
如果bean实现了ApplicationContextAware接口,Spring将调用setApplicationContext()方法,将bean所在的应用上下文的引用传入进来;
如果bean实现了BeanPostProcessor接口,Spring将调用它们的post-ProcessBeforeInitialization()方法;
如果bean实现了InitializingBean接口,Spring将调用它们的after-PropertiesSet()方法。类似地,如果bean使用initmethod声明了初始化方法,该方法也会被调用;
如果bean实现了BeanPostProcessor接口,Spring将调用它们的post-ProcessAfterInitialization()方法;
此时,bean已经准备就绪,可以被应用程序使用了,它们将一直驻留在应用上下文中,直到该应用上下文被销毁;
如果bean实现了DisposableBean接口,Spring将调用它的destroy()接口方法。同样,如果bean使用destroy-method声明了销毁方法,该方法也会被调用。
7.@Component、@Repository、@Service和@Controller的区别
@Component:将Java类标记为bean
@Repository:在Dao层应用
@Service:在Service层应用
@Controller:在Controller层应用
@Autowired和@Resource的区别
@Resource的作用相当于@Autowired,只不过@Autowired按byType自动注入,而@Resource默认按 byName自动注入罢了。@Resource有两个属性是比较重要的,分是name和type,Spring将@Resource注解的name属性解析为bean的名字,而type属性则解析为bean的类型。所以如果使用name属性,则使用byName的自动注入策略,而使用type属性时则使用byType自动注入策略。如果既不指定name也不指定type属性,这时将通过反射机制使用byName自动注入策略。
1、 @Autowired与@Resource都可以用来装配bean. 都可以写在字段上,或写在setter方法上。
2、 @Autowired默认按类型装配(这个注解是属业spring的),默认情况下必须要求依赖对象必须存在,如果要允许null值,可以设置它的required属性为false,如:@Autowired(required=false)
Spring AOP
面向切面编程,动态代理植入,减少重复的代码,降低模块儿间的耦合,提供可维护性。
Spring动态代理的两种实现方式
JDK动态代理:只提供接口的代理,不支持类的代理。核心是InvocationHandler接口和Proxy类,InvocationHandler通过invoke()方法反射来调用目标类中的代码,动态地横切业务逻辑,接着,Proxy利用InvocationHandler动态创建一个符合某一接口的实例,生成目标代理对象
CgLib动态代理:是一个代码生成的类库,可以在运行时动态的生成指定类的一个子类对象,并覆盖其中特定的方法添加增强代码,实现AOP。CgLib通过继承的方式实现,如果类被标记为final,那么便无法使用CgLib作为动态代理
我们也可以编写一个通用的动态代理实现的类
public class ProxyInvocationHandler implements InvocationHandler {
private Object target;
public void setTarget(Object target) {
this.target = target;
}
//生成代理类
public Object getProxy(){
return Proxy.newProxyInstance(this.getClass().getClassLoader(),
target.getClass().getInterfaces(),this);
}
// proxy : 代理类
// method : 代理类的调用处理程序的方法对象.
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
log(method.getName());
Object result = method.invoke(target, args);
return result;
}
public void log(String methodName){
System.out.println("执行了"+methodName+"方法");
}
}