一、Spring注解开发
1)注解创建对象
创建对象有四个注解,四个注解功能暂时相同,都为创建对象
(1)@Component
(2)@Controller
(3)@Service
(4)@Repository
步骤:
1)导包
2)创建类,创建方法。
3)在类上添加注解。
4)创建配置文件,引入约束
5)开启注解扫描
代码示例:
//注解类创建对象
@Component(value="bookDao") //此行代码相当于 <bean id="user" class=""></bean>
public class BookDao {
public void add(){
System.out.println("BookDao.add()");
}
}
xml:
<!-- 开启注解扫描
扫描范围:扫描 (指定包里的)类、方法、属性上面是否有注解。
base-package:指定包 指定多个包时 包名用逗号隔开即可
-->
<context:component-scan base-package="user"></context:component-scan>
2)注解注入属性
注入属性有两个注解:
1)Autowired :根据属性类型自动装配
2)Resource:指定注解。
示例:将dao作为属性注入到service中
步骤:
1)创建service和dao类,创建方法,在类上添加注解。
2)在配置文件中开启注解扫描。
3)在service类中定义dao属性
4)在属性上添加注解
代码:
@Component(value="bookService") //注解类创建对象
public class BookService {
@Resource(name="bookDao") //注解属性
private BookDao bookDao;
public void test(){
bookDao.add();
}
}
3)xml和注解方式的混合使用
- 创建对象使用配置文件,
- 注入属性使用注解
1.2 scope注解讲解 ---- 指明创建对象单实例还是多实例。
@scope注解属性值讲解
1.singleton:单例模式。
2.prototype:多例模式
3.request
1)request表示该针对每一次HTTP请求都会产生一个新的bean,
2)同时该bean仅在当前HTTP request内有效,
4.session
1)session作用域表示该针对每一次HTTP请求都会产生一个新的bean,
2)同时该bean仅在当前HTTP session内有效
二、AOP概念
1 aop:面向切面(方面)编程,扩展功能不修改源代码实现
2 AOP采取横向抽取机制,取代了传统纵向继承体系重复性代码
3 aop底层使用动态代理实现
(1)第一种情况,有接口情况,使用动态代理创建接口实现类代理对象
(2)第二种情况,没有接口情况,使用动态代理创建类的子类代理对象
AOP原理画图分析
2.2 AOP操作术语
1)Pointcut(切入点):所谓切入点是指我们要对哪些Joinpoint进行拦截的定义.
2)Advice(通知/增强):所谓通知是指拦截到Joinpoint之后所要做的事情就是通知.通知分为前置通知,后置通知,异常通知,最终通知,环绕通知(切面要完成的功能)
3)Aspect(切面): 是切入点和通知(引介)的结合
4)Joinpoint(连接点): 类里面可以被增强的方法,这些方法称为连接点
5)Introduction(引介):引介是一种特殊的通知在不修改类代码的前提下, Introduction可以在运行期为类动态地添加一些方法或Field.
6)Target(目标对象):代理的目标对象(要增强的类)
7)Weaving(织入):是把增强应用到目标的过程.(把advice 应用到 target的过程)
8)Proxy(代理):一个类被AOP织入增强后,就产生一个结果代理类
2.3 execution表达式
作用:使用execution表达式配置切入点
切入点:实际增强的方法
标准格式:execution(<访问修饰符>?<返回类型><方法名>(<参数>)<异常>)
常用格式:execution(修饰符类型 类全路径.方法(..))
解释:第一个 * 表示修饰符类型;(..)表示任意参数
示例:
1)execution(* cn.itcast.aop.Book.add(..)) //增强指定类中指定方法
2)execution(* cn.itcast.aop.Book.*(..)) //增强指定类中所有方法
3)execution(* *.*(..)) //增强所有类中所有方法
4)execution(* save*(..)) //增强所有sava开头的方法。
三、Spring的aop操作
1 aspectj介绍:
1)aspectj不是spring一部分,和spring一起使用进行aop操作
2)Spring2.0以后新增了对AspectJ支持
在spring里面使用aspectj实现aop操作!
2 使用aspectj实现aop的两种方式
1)基于aspectj的xml配置
2)基于aspectj的注解方式
Aop操作 1(配置xml方式)
步骤:
1) 导包
2) 创建spring核心配置文件,导入aop的约束
3) 创建原始类、原始方法
4) 创建增强类、增强方法
5) 配置切入点,切面 (重点)
6)测试
代码示例:
1. //原始类
public class Book {
//原始方法
public void add(){
System.out.println("add()......");
}
}
2. //增强类
public class MyBook {
//增强方法
public void before1(){
System.out.println("前置通知");
}
//增强方法
public void after1(){
System.out.println("后置通知");
}
//增强方法
//环绕通知
//底层原理:使用ProceedingJoinPoint类指代被执行的方法。该类中的.proceed()方法表示开始执行。
public void around1(ProceedingJoinPoint proceedingJoinPoint) throws Throwable{
System.out.println("方法之前");
//执行被增强的方法
proceedingJoinPoint.proceed();
System.out.println("方法之后");
}
}
3.xml:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd"> <!-- bean definitions here -->
<!-- 1 配置对象 -->
<bean id="book" class="book.Book"></bean>
<bean id="myBook" class="book.MyBook"></bean>
<!-- 2 配置aop操作 -->
<aop:config>
<!-- 2.1 配置切入点 使用execute表达式
expression属性值:execute表示式
id:为切入点名称
-->
<aop:pointcut expression="execution(* book.Book.*(..))" id="pointcut1"/>
<!-- 2.2 配置切面(把增强应用到方法上)
步骤:
1)配置增强类。
2)再增强类中配置增强方法,并给切面配置切入点
-->
<aop:aspect ref="myBook">
<!-- 配置增强类型
method:增强方法的 方法名
pointcut-ref:切入点引用配置
-->
<aop:before method="before1" pointcut-ref="pointcut1"/>
<aop:after-returning method="after1" pointcut-ref="pointcut1"/>
<aop:around method="around1" pointcut-ref="pointcut1"/>
</aop:aspect>
</aop:config>
</beans>
Aop操作 2 (注解方式)
使用注解方式实现aop操作
步骤:
1)导包
2)创建原始对象、原始方法。
3)创建增强对象、增强方法
4)创建spring配置文件,导入aop约束、
5)在配置文件中开启aop注解扫描
<!-- 开启aop注解扫描 -->
<aop:aspectj-autoproxy></aop:aspectj-autoproxy>
6)在增强类上注解切面、注解增强方法。
1)@Aspect //注解切面
2)@Before(value="execution(* book.Book.add(..))") //使用execution表达式标明被增强方法
代码示例:
//增强类
@Aspect //注解切面
public class MyBook {
//增强方法
@Before(value="execution(* book.Book.add(..))")
public void before1(){
System.out.println("前置通知");
}
//增强方法
@After(value="execution(* book.Book.add(..))")
public void after1(){
System.out.println("后置通知");
}
//增强方法
//环绕通知
//底层原理:使用ProceedingJoinPoint类指代被执行的方法。该类中的.proceed()方法表示开始执行。
@Around(value="execution(* book.Book.add(..))")
public void around1(ProceedingJoinPoint proceedingJoinPoint) throws Throwable{
System.out.println("方法之前");
//执行被增强的方法
proceedingJoinPoint.proceed();
System.out.println("方法之后");
}
}
四、log4j介绍
作用:通过log4j可以看程序运行过程中的详细信息
使用
1)导入log4j的jar包
2)复制log4j的配置文件,复制到src下面
设置日志级别
1)info:看到基本信息
2)debug:看到更详细信息
五、解决配置文件多次加载问题
问题:每次访问action时候,都会加载spring配置文件
解决方案:
1)在服务器启动时候,创建对象加载配置文件
2)底层使用监听器、ServletContext对象
实现思想:使用在spring里面已封装的监听器
步骤:
1)导入spring整合web项目的jar包
2)在web.xml中,配置监听器
3)在web.xml中,指定加载spring配置文件位置