ml和注解的区别
xml:优点:
- 把标签配置和java代码解耦
- 一目了然,对于业务量大的需求,可以清晰表明各个对象的关系
缺点:
- 1.配置不方便,读取和解析需要一定的时间
- 2.无法及时校验正确性
注解优点:
- 配置方便,提高开发效率
- 及时校验正确性
- 不需要第三方工具解析,利用java反射完成
缺点:
配置和java耦合到一起,修改之后需要重新编译
各个对象之间关系不明确
注解过多,影响代码质量和美观
@Autowired
是什么:注解形式的自动装配==自动注入
怎莫用:
1.写在set方法上,注入方式就是通过set方法注入
2.写在属性上,注入方式就是反射
先通过byType,先通过类型匹配;找不到再使用byName,通过set方法的名字或者参数列表的变量名。
@Qualifier
和Autowired一起使用,强制把Autowired改成byName
@Resource
先通过byName去找,先通过set方法名去找,找不到再通过参数列表的变量名去找。
找不到再换成byType去找
注解开发的使用步骤
1.去配置文件中开启注解支持
2.配置扫描包的路径
3.给需要被spring管理的类上加上@Component或者具有他含义的其他注解
@service 业务处理类
@Repository 数据持久层
@Controller 控制层
@Autowired 自动注入
@Resource 自动注入
新注解
完全编程注解开发,去掉了xml配置文件,换成了配置类
configuration,规定某个类为配置类
componentScan 加在配置上,确定扫描包的路径
value
propertySource读取配置文件
- Bean,Bean他是把接下来的方法的返回值当成bean注入到spring容器里
- Bean下的方法返回值类型就是该bean在spring容器中的类型
- 方法的方法名就是该bean在spring容器中的名字
- 但是在调用时,类型相同则报错,需要通过名字获取
AOP
AOP(Aspect Oriented Programming)意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。
AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。
AOP在Spring中的作用
提供声明式事务;允许用户自定义切面
以下名词需要了解下:
横切关注点:跨越应用程序多个模块的方法或功能。即是,与我们业务逻辑无关的,但是我们需要关注的部分,就是横切关注点。如日志 , 安全 , 缓存 , 事务等等 …
切面(ASPECT):横切关注点 被模块化 的特殊对象。即,它是一个类。
通知(Advice):切面必须要完成的工作。即,它是类中的一个方法。
目标(Target):被通知对象。
代理(Proxy):向目标对象应用通知之后创建的对象。
切入点(PointCut):切面通知 执行的 “地点”的定义。
连接点(JointPoint):与切入点匹配的执行点。
使用spring实现AOP
使用注解的方法
1.编写一个注解实现的增强类
package com.kuang.config;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
@Aspect
public class AnnotationPointcut {
@Before("execution(* com.kuang.service.UserServiceImpl.*(..))")
public void before(){
System.out.println("---------方法执行前---------");
}
@After("execution(* com.kuang.service.UserServiceImpl.*(..))")
public void after(){
System.out.println("---------方法执行后---------");
}
@Around("execution(* com.kuang.service.UserServiceImpl.*(..))")
public void around(ProceedingJoinPoint jp) throws Throwable {
System.out.println("环绕前");
System.out.println("签名:"+jp.getSignature());
//执行目标方法proceed
Object proceed = jp.proceed();
System.out.println("环绕后");
System.out.println(proceed);
}
}
2.在配置文件中,注册bean,并开启支持注解
<!--第三种方式:注解实现-->
<bean id="annotationPointcut" class="com.kuang.config.AnnotationPointcut"/>
<aop:aspectj-autoproxy/>
javaspring