java复习之Spring

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+"方法");
  }

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值