文章目录

  • ​​一. spring的bean管理(注解方式)​​
  • ​​1. 注解介绍​​
  • ​​2. Spring注解开发准备工作​​
  • ​​1. 导入jar包​​
  • ​​2. 创建类,创建方法​​
  • ​​3. 创建spring配置文件,引入约束​​
  • ​​4 配置开启注解扫描​​
  • ​​3. 注解创建对象​​
  • ​​(1) 在创建对象的类上面使用注解实现​​
  • ​​(2) Spring创建对象有四个注解​​
  • ​​1. @Component:组件(作用在类上)​​
  • ​​2. @Controller :WEB 层​​
  • ​​3. @Service :业务层​​
  • ​​4. @Repository :持久层​​
  • ​​(3). 注解配置对象是单实例还是多实例(Bean 的作用范围的注解)​​
  • ​​(4). Bean 的生命周期的配置​​
  • ​​4. 注解注入属性(使用注解注入的方式,可以不用提供 set 方法)​​
  • ​​(1). @Value :用于注入普通类型.​​
  • ​​(2). @Autowired :自动装配:​​
  • ​​(3). @Qualifier:强制使用名称注入.​​
  • ​​(4). @Resource​​
  • ​​5. Spring 的 Bean 管理的方式的比较​​
  • ​​二. AOP概述​​
  • ​​1. 什么是 AOP​​
  • ​​2. 为什么学习 AOP​​
  • ​​3. Spring 的 AOP 的由来​​
  • ​​4. AOP底层实现​​
  • ​​三. spring的AOP操作(基于AspectJ 的 AOP开发)​​
  • ​​1. AOP 的开发中的相关术语:​​
  • ​​四. Spring 使用AspectJ进行AOP的开发:XML的方式(理解)​​
  • ​​1. 什么是AspectJ​​
  • ​​(1). 在spring里面进行aop操作,使用aspectj实现​​
  • ​​(2). 使用aspectj实现aop有两种方式​​
  • ​​1. 基于aspectj的xml配置​​
  • ​​2. 基于aspectj的注解方式​​
  • ​​2. Aop操作准备​​
  • ​​(1). 除了导入基本的jar包之外,还需要导入aop相关的jar包​​
  • ​​(2). 创建spring核心配置文件,导入aop的约束​​
  • ​​3. 使用表达式配置切入点​​
  • ​​(1). 切入点​​
  • ​​(2). execution(表达式)​​
  • ​​4. Aspectj的aop操作​​
  • ​​(1). 编写目标类​​
  • ​​(2). 目标类的配置​​
  • ​​(3). 进行测试​​
  • ​​五. 基于AspectJ的注解AOP操作(会用)​​
  • ​​1. 准备工作​​
  • ​​2. 编写代码​​
  • ​​3. 配置spring核心文件​​
  • ​​4. 进行测试​​
  • ​​六. log4j介绍​​
  • ​​1 通过log4j可以看到程序运行过程中更详细的信息​​
  • ​​2 使用log4j​​
  • ​​3. 设置日志级别​​
  • ​​七. spring整合web项目演示​​
  • ​​1. 出现的问题​​
  • ​​2. 解决方案:​​
  • ​​3 在spring里面不需要我们自己写代码实现,帮我们封装​​
  • ​​(1)封装了一个监听器,只需要 配置监听器 就可以了​​
  • ​​(2)配置监听器之前做事情:导入spring整合web项目jar包​​
  • ​​(3)指定加载spring配置文件位置​​

一. spring的bean管理(注解方式)

1. 注解介绍

  • 1 代码里面特殊标记,使用注解可以完成功能
  • 2 注解写法 @注解名称(属性名称=属性值)
  • 3 注解使用在类上面,方法上面 和 属性上面

2. Spring注解开发准备工作

1. 导入jar包

基本jar包

Spring_Day02_spring


导入aop的jar包,在 Spring 的注解的 AOP 中需要引入 spring-aop 的 jar 包。

Spring_Day02_jar包_02

2. 创建类,创建方法

Spring_Day02_jar包_03

3. 创建spring配置文件,引入约束
  • 第一天做ioc基本功能,引入约束beans
  • 做spring的ioc注解开发,引入新的约束
4 配置开启注解扫描

Spring_Day02_spring_04

3. 注解创建对象

(1) 在创建对象的类上面使用注解实现

Spring_Day02_AOP_05


编写测试类:进行测试输出

Spring_Day02_jar包_06

(2) Spring创建对象有四个注解

目前这四个注解功能是一样的,都创建对象

1. @Component:组件(作用在类上)

2. @Controller :WEB 层

3. @Service :业务层

4. @Repository :持久层

(3). 注解配置对象是单实例还是多实例(Bean 的作用范围的注解)

@Scope:

  • singleton:单例
  • prototype:多例
  • Spring_Day02_AOP_07


(4). Bean 的生命周期的配置

  • @PostConstruct :相当于 init-method
  • @PreDestroy :相当于 destroy-method

4. 注解注入属性(使用注解注入的方式,可以不用提供 set 方法)

(1). @Value :用于注入普通类型.

(2). @Autowired :自动装配:

  • 默认按类型进行装配
  • 按名称注入:

(3). @Qualifier:强制使用名称注入.

(4). @Resource

相当于: @Autowired 和@Qualifier 一起使用.

5. Spring 的 Bean 管理的方式的比较

Spring_Day02_spring_08

XML 和注解比较:

  • XML :结构清晰.
  • 注解 :开发方便.(属性注入.)

xml和注解方式混合使用

  • Bean 有 XML 配置.但是使用的属性使用注解注入.
  • 创建对象使用配置文件,注入属性使用注解
二. AOP概述

1. 什么是 AOP

Spring_Day02_spring_09


面向切面(方面)编程:扩展功能不修改源代码实现

  • AOP采取横向抽取机制,取代了传统纵向继承体系重复性代码
  • Spring_Day02_spring_10


  • Spring_Day02_spring_11


2. 为什么学习 AOP

对程序进行增强:不修改源码的情况下.

  • AOP 可以进行权限校验,日志记录,性能监控,事务控制

3. Spring 的 AOP 的由来

  • AOP 最早由 AOP 联盟的组织提出的,制定了一套规范.Spring 将 AOP 思想引入到框架中,必须遵守 AOP 联盟的规范

4. AOP底层实现

代理机制:Spring 的 AOP 的底层用到两种代理机制:

  • JDK 的动态代理 :针对实现了接口的类产生代理.

    public class MyJDKProxy implements InvocationHandler{
    private UserDao userDao;

    public MyJDKProxy(UserDao userDao) {
    this.userDao = userDao;
    }

    // 编写工具方法:生成代理:
    public UserDao createProxy(){
    UserDao userDaoProxy = (UserDao) Proxy.newProxyInstance(userDao.getClass().getClassLoader(),userDao.getClass().getInterfaces(), this);

    return userDaoProxy;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable
    {
    if("save".equals(method.getName()))
    {
    System.out.println("权限校验================");
    }
    return method.invoke(userDao, args);
    }
    }
  • Cglib 的动态代理 :针对没有实现接口的类产生代理. 应用的是底层的字节码增强的技术生成当前类的子类对象

public class MyCglibProxy implements MethodInterceptor
{
private CustomerDao customerDao;

public MyCglibProxy(CustomerDao customerDao)
{
this.customerDao = customerDao;
}

// 生成代理的方法:
public CustomerDao createProxy(){

// 创建 Cglib 的核心类:
Enhancer enhancer = new Enhancer();

// 设置父类:
enhancer.setSuperclass(CustomerDao.class);

// 设置回调:
enhancer.setCallback(this);

// 生成代理
CustomerDao customerDaoProxy = (CustomerDao) enhancer.create();
return customerDaoProxy;
}
@Override
public Object intercept(Object proxy, Method method, Object[] args,MethodProxy methodProxy) throws Throwable
{
if("delete".equals(method.getName()))
{
Object obj = methodProxy.invokeSuper(proxy, args);
System.out.println("日志记录================");
return obj;
}
return methodProxy.invokeSuper(proxy, args);
}
}
三. spring的AOP操作(基于AspectJ 的 AOP开发)

1. AOP 的开发中的相关术语:

  • Joinpoint(连接点):所谓连接点是指那些被拦截到的点。在 spring 中,这些点指的是方法,因为 spring 只支持方法类型的连接点.
  • Pointcut(切入点):所谓切入点是指我们要对哪些 Joinpoint 进行拦截的定义.
  • Advice(通知/增强):所谓通知是指拦截到 Joinpoint 之后所要做的事情就是通知.通知分为前置通知,后置通知,异常通知,最终通知,环绕通知(切面要完成的功能)
  • Introduction(引介):引介是一种特殊的通知在不修改类代码的前提下,Introduction 可以在运行期为类动态地添加一些方法或 Field.
  • Target(目标对象):代理的目标对象
  • Weaving(织入):是指把增强应用到目标对象来创建新的代理对象的过程.
  • spring 采用动态代理织入,而 AspectJ 采用编译期织入和类装在期织入
  • Proxy(代理):一个类被 AOP 织入增强后,就产生一个结果代理类
  • Aspect(切面): 是切入点和通知(引介)的结合

Spring_Day02_jar包_12

四. Spring 使用AspectJ进行AOP的开发:XML的方式(理解)

1. 什么是AspectJ

(1). 在spring里面进行aop操作,使用aspectj实现

  • aspectj不是spring一部分,和spring一起使用进行aop操作
  • Spring2.0以后新增了对AspectJ支持
  • AspectJ是一个面向切面的框架,它扩展了Java语言,AspectJ定义了AOP语法,所以它有一个专门的编译器用来生成遵循Java字节编码规范的Class文件

(2). 使用aspectj实现aop有两种方式

1. 基于aspectj的xml配置

2. 基于aspectj的注解方式

2. Aop操作准备

(1). 除了导入基本的jar包之外,还需要导入aop相关的jar包

Spring_Day02_spring_13

(2). 创建spring核心配置文件,导入aop的约束

引入 AOP 约束:

<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">
</beans>

3. 使用表达式配置切入点

(1). 切入点

实际增强的方法

(2). execution(表达式)

表达式 : [方法访问修饰符] 方法返回值 包名.类名.方法名(方法的参数)

  • 第一个* 可以用public替换
  • 写法一:execution(* com.pudding.spring.Book.add(…))对Book类里面的add方法进行增强
  • 写法二:execution(* com.pudding.spring.Book.*(…))对Book类里面的所有方法进行增强
  • 写法三:execution(* .(…))对所有类里面的所有方法进行增强
  • 匹配所有save开头的方法 execution(* save*(…))

4. Aspectj的aop操作

(1). 编写目标类

Spring_Day02_AOP_14


Spring_Day02_AOP_15

(2). 目标类的配置

Spring_Day02_AOP_16


Spring_Day02_spring_17

(3). 进行测试

Spring_Day02_jar包_18


Spring_Day02_AOP_19

五. 基于AspectJ的注解AOP操作(会用)

1. 准备工作

导包

Spring_Day02_jar包_20

导入aop约束

Spring_Day02_jar包_21

2. 编写代码

Spring_Day02_jar包_22

3. 配置spring核心文件

Spring_Day02_spring_23

4. 进行测试

Spring_Day02_jar包_24

六. log4j介绍

1 通过log4j可以看到程序运行过程中更详细的信息

  • 经常使用log4j查看日志
  • Spring_Day02_AOP_25


  • Spring_Day02_jar包_26


2 使用log4j

  • 导入log4j的jar包
  • 复制log4j的配置文件,复制到src下面

Spring_Day02_spring_27

3. 设置日志级别

  • info:看到基本信息
  • debug:看到更详细信息
  • Spring_Day02_jar包_28


  • Spring_Day02_spring_29


七. spring整合web项目演示

1. 出现的问题

(1)action调用service,service调用dao

Spring_Day02_spring_30


访问action的时候,这个UserAction对象会通过struts.xml被创建,而在UserAction中每次都要通过上面标记的那部分代码得到userService对象。

Spring_Day02_spring_31


每次访问action时候,都会加载spring配置文件,功能上没有问题,但是性能会很低

2. 解决方案:

(1)在服务器启动时候,创建对象加载配置文件
(2)底层使用监听器、ServletContext对象

3 在spring里面不需要我们自己写代码实现,帮我们封装

(1)封装了一个监听器,只需要 配置监听器 就可以了

Spring_Day02_spring_32

(2)配置监听器之前做事情:导入spring整合web项目jar包

Spring_Day02_spring_33

(3)指定加载spring配置文件位置

Spring_Day02_spring_34


如果没有指定:就会报错:

出现异常时候,第一行 异常信息

下面 cased by :

Spring_Day02_jar包_35


Spring_Day02_AOP_36