Spring_Day02

文章目录

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

1. 注解介绍

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

2. Spring注解开发准备工作

1. 导入jar包

基本jar包
在这里插入图片描述
导入aop的jar包,在 Spring 的注解的 AOP 中需要引入 spring-aop 的 jar 包。
在这里插入图片描述

2. 创建类,创建方法

在这里插入图片描述

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

在这里插入图片描述

3. 注解创建对象

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

在这里插入图片描述
编写测试类:进行测试输出
在这里插入图片描述

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

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

1. @Component:组件(作用在类上)
2. @Controller :WEB 层
3. @Service :业务层
4. @Repository :持久层

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

@Scope:

  • singleton:单例
  • prototype:多例
    在这里插入图片描述

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

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

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

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

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

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

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

(4). @Resource

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

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

在这里插入图片描述

XML 和注解比较:

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

xml和注解方式混合使用

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

二. AOP概述

1. 什么是 AOP

在这里插入图片描述
面向切面(方面)编程:扩展功能不修改源代码实现

  • AOP采取横向抽取机制,取代了传统纵向继承体系重复性代码
    在这里插入图片描述
    在这里插入图片描述

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 使用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包

在这里插入图片描述

(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). 编写目标类

在这里插入图片描述
在这里插入图片描述

(2). 目标类的配置

在这里插入图片描述
在这里插入图片描述

(3). 进行测试

在这里插入图片描述
在这里插入图片描述

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

1. 准备工作

导包
在这里插入图片描述

导入aop约束
在这里插入图片描述

2. 编写代码

在这里插入图片描述

3. 配置spring核心文件

在这里插入图片描述

4. 进行测试

在这里插入图片描述

六. log4j介绍

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

  • 经常使用log4j查看日志
    在这里插入图片描述
    在这里插入图片描述

2 使用log4j

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

在这里插入图片描述

3. 设置日志级别

  • info:看到基本信息
  • debug:看到更详细信息
    在这里插入图片描述
    在这里插入图片描述

七. spring整合web项目演示

1. 出现的问题

(1)action调用service,service调用dao
在这里插入图片描述
访问action的时候,这个UserAction对象会通过struts.xml被创建,而在UserAction中每次都要通过上面标记的那部分代码得到userService对象。

在这里插入图片描述
每次访问action时候,都会加载spring配置文件,功能上没有问题,但是性能会很低

2. 解决方案:

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

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

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

在这里插入图片描述

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

在这里插入图片描述

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

在这里插入图片描述
如果没有指定:就会报错:
出现异常时候,第一行 异常信息
下面 cased by :
在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值