1:注解方式进行属性的装配
spring提供的装配标签:autowried和qualifier。
通过@autowired注解可以让spring自动的把属性需要的对象从配置文件中找出来,并注入给该属性。
在spring3.0之前,需要在配置文件中配置<context:annotation-config/>,才会去识别@autowired注解。
@autowired注解用在属性或者setter方法上,可以同时为一个属性注入多个对象
默认情况下,@autowired注解必须要找到对应的对象,否则报错。不过,可以使用required=false来避免该问题:@autowired(...)
@autowired找bean的方式,首先按照类型去找,如果找到多个匹配的类型,再去按照名字找,如果没有匹配就报错
可以使用@Qualifier(”otherBean“)注解来规定依赖对象按照bean的id+类型去找
JavaEE提供的装配标签
@Resource注解
@Resource注解必须要求有匹配的对象
<context:annotation-config>,既引入了@Autowired标签的解析器,又引入了@Resource标签的解析器
@Resource标签找Bean的方式:首先按照名字取找,找不到再按照类型去找,如果找到多个匹配的类型,就报错
@Resource(name="xxx"):可以使用name属性指定Bean的名称。但是,如果指定了name,那么如果找不到指定名称的Bean,就不会再按照类型去找,直接报错。
@Autowired VS @Resource:
1,@Autowired:是Spring定义的标签,所以不太稳定,并且对象和spring框架关联(Spring对我们的代码有侵入);
2,@Resouce:是J2EE的规范,所以稳定,在J2EE规范容器中也能正常使用;
2:使用注解简化inversion of control
》使用注解来完成IOC,就必须要有IOC的注解解析器
使用<context:component-scan base-package=""/>来扫描spring需要管理的Bean
base-package的作用:告诉spring,去哪些包及其子包下扫描Bean
》标注Bean的注解:@Component
默认情况,bean的名字是类名首字母小写
如果要修改bean的名称,直接使用value属性来重新定义 @Component(value="xxx")
》使用Component的限制,不能运用到静态工厂方法和实例工厂方法,不能运用到没有源代码的类,框架内部类(没有源代码无法使用,不能对框架的源码进行修改)
》Bean组件版型标签
@Service:用于标注业务层组件
@Controller:用于标注控制层组件
@Repository:用于标注DAO层组件
@Component:当组件不好归类的时候,使用这个组件
》指定Bean的作用域:@Scope(”prototype“)
》初始化和销毁方法:@PostConstruct/@PreDestroy
3:装饰设计模式
什么是装饰设计模式?
就是在不改变源码的基础上,动态的扩展一个对象的功能。它是通过创建一个包装对象,也就是包裹真实的对象。说的直白点,就是对已有对象的功能的增强。
4:静态代理模式
代理模式:客户端直接使用的都是代理对象,根本不知道真实对象是谁。此时,代理对象在客户端和真实对象间起到了中介作用
》代理对象完全包含真实对象,客户端使用的都是代理对象的方法,和真实对象没有直接关系
》代理对象的职责:把不是真实对象该做的事情,从它身上撇开
静态代理:在程序运行前,就已经存在代理类的字节码文件,代理对象和真实对象的关系在程序运行前就确定了。
动态代理:动态代理类是程序运行期间由Java virtual machine通过反射等机制动态的生成的,所以不存在代理类的字节码文件。代理对象和真实对象的关系在程序运行期间才确定的。
5:AOP面向切面编程
》AOP的目的: 将那些和业务逻辑无关的,却被业务模块所共同调用的逻辑封装起来。便于减少系统的重复代码,降低模块之间的耦合度。
》AOP中的概念:
连接点(joinpoint):能做增强的方法就可以称为是连接点
切入点:(pointcut)在哪些类的哪些方法上做切入
增强(advice):在方法执行的什么时机做什么(增强的功能)
切面(Aspect):切面=切入点+增强/通知,多个通知和切入点的组合
织入(Weaving):把切面加入到对象,并创建出代理对象的过程
目标(Target):被增强的对象称为目标
6:XML方式实现AOP
AOP规范本应该由sun公司提出,但是被aop联盟捷足先登,Aop联盟制定出AOP规范后,首先就要解决一个问题,怎么表示在哪些方法上面做增强.-----AspectJ语言
AspectJ切入点语法如下:(表示哪些包下的哪些类的哪些方法做切入)
execution(修饰符?返回类型 声明类型 方法名 参数 异常)
...