Spring有两种代理方式: 1.若目标对象实现了若干接口,spring使用JDK的动态代理。 优点:因为有接口,所以使系统更加松耦合 缺点:为每一个目标类创建接口 2.若目标对象没有实现任何接口,spring使用CGLIB库生成目标对象的子类。 优点:因为代理类与目标类是继承关系,所以不需要有接口的存在。 缺点:因为没有使用接口,所以系统的耦合性没有使用JDK的动态代理好。 SpringAOP的具体加载步骤: 1、当spring容器启动的时候,加载了spring的配置文件 2、为配置文件中所有的bean创建对象 3、spring容器会解析aop:config的配置,解析切入点表达式,用切入点表达式和纳入spring容器中的bean做匹配,如果匹配成功,则会为该bean创建代理对象,代理对象的方法=目标方法+增强。 如果匹配不成功,不会创建代理对象 4、在客户端利用getBean获取对象时,如果该对象有代理对象则返回代理对象,如果没有代理对象,则返回目标对象 Spring中BeanFactory和ApplicationContext的作用和区别 1. BeanFactory负责读取bean配置文档,管理bean的加载,实例化,维护bean之间的依赖关系,负责bean的生命周期。 2. ApplicationContext除了提供上述BeanFactory所能提供的功能之外,还提供了更完整的框架功能: a. 国际化支持 b. 资源访问:Resource rs = ctx. getResource(”classpath:config.properties”), “file:c:/config.properties” c. 事件传递:通过实现ApplicationContextAware接口 3. 常用的获取ApplicationContext的方法: FileSystemXmlApplicationContext:从文件系统或者url指定的xml配置文件创建,参数为配置文件名或文件名数组 ClassPathXmlApplicationContext:从classpath的xml配置文件创建,可以从jar包中读取配置文件 WebApplicationContextUtils:从web应用的根目录读取配置文件,需要先在web.xml中配置,可以配置监听器或者servlet来实现 Spring中的自动装配有哪些限制? - 如果使用了构造器注入或者setter注入,那么将覆盖自动装配的依赖关系。
- 基本数据类型的值、字符串字面量、类字面量无法使用自动装配来注入。
- 优先考虑使用显式的装配来进行更精确的依赖注入而不是使用自动装配。
|