一、基于注解的方式配置bean/bean的装配
- 常用的注解
@Component:标识为一个组件
@Repository:标识为一个持久层的组件
@Service:标识为一个业务层的组件
@Controller:标识为一个表现层的组件
@AutoWired:自动装配
@Qualifier:具体的指定要装配的bean的id值 - 开启注解配置
<context:component-scan base-package="基包"></context:component-scan> use-default-filters="true/false":是否使用默认的过滤 <context:include-filter type="annotation/assignable"expression="注解的全类名/组件类的全类名"/> <context:include-filter>需要配合 use-default-fiters="false"来使用 <context:exclude-filter type="annotation/assignable"expression="注解的全类名/组件类的全类名"/>
- @AutoWired
- 优先匹配兼容的类型来进行注入.如果有多个兼容的类型匹配,则再尝试使用被注入的属性名跟ioc容器中bean的id值进行匹配。
- required: 默认情况下,被 @AutoWired 标注的属性必须要被装配.可以使用required="false"来改变默认的行为.
- 可以使用@Qualifier来具体指定要装配的bean的id值.
二、AOP
1. 动态代理
-
动态代理实现的方式:
jdk动态代理 基于接口实现代理
cglib动态代理 基于子类的方式实现代理
javassist动态代理 基于子类的方式实现代理 -
jdk的动态代理
public Object getLoggingProxy(){ //定义代理对象 Object proxy ; /** * loader: ClassLoader 类加载器 * interfaces: 目标类的所接口,目的是获取接口中的方法 * h: InvocationHandler */ ClassLoader loader = proxy.getClass().getClassLoader(); Class[] interfaces = proxy.getClass().getInterfaces(); InvocationHandler h = new InvocationHandler() { /** * proxy:代理对象 在invoke方法中一般不会用 * method:正在调用的方法 * args:调用方法传入的参数 */ @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { String methodName = method.getName(); //加日志 System.out.println("ATGUIGU===>The method "+methodName+" begins with "+ Arrays.asList(args)); //执行目标方法 Object result = method.invoke(proxy, args); //加日志 System.out.println("ATGUIGU===>The method "+methodName+" ends with " + result ); return result; } }; proxy = (Object) Proxy.newProxyInstance(loader, interfaces, h); return proxy ; }
2.SpringAOP
- 切面
将横切关注点模块化后形成切面. - 通知
前置通知
后置通知
返回通知
异常通知
环绕通知
3. 基于注解方式配置AOP
4. 基于xml方式配置AOP
- 切面的优先级
如果是基于注解的方式,可以使用@Order(值)来指定切面的优先级.值越小优先级越高
如果是基于xml的方式,可以使用order属性来指定切面的优先级. - 重用切入点表达式
- 切面的优先级
Spring 事务管理
1. 基于注解
- 配置事务管理器以及开启事务注解
tx:annotation-driven中 transaction-manager的默认值是transactionManager,如果当前事务管理器的id值就是transactionManager,那么transaction-manager的配置可以省略.如果当前事务管理器的id值不是transactionManager,那么就必须在transaction-manager中指定当前的事务管理器的id值。 - @Transactional
该注解可以加到类上,也可以加到方法上。加到类上的对当前类中所有的方法都起作用。如果类与方法上都加了该注解,则方法上的优先于类上的. - 事务的属性