Spring的学习-day03

Spring的学习-day03

1.applicationContext.xml中的配置

  • 设置扫描和不扫描哪些包

    
    <!-- 1.设置扫描和不扫描哪些包 
    	   (1)属性resource-pattern:指定扫描哪个包
    	   (2)子标签context:include-filter:用户来设置只扫描哪个包下的类
    	      如果type的值是annotation,那么expression的值是注解的全类名
    	      如果type的值是assignable,那么expression的值是接口或者实现类的全类名
    	      如果想通过子标签context:include-filter来指定只扫描哪个包下的类,必须
    	      设置context:component-scan的use-default-filters的属性为   false
    	   (3)context:exclude-filter:用来设置不扫描哪个包的下类
    -->
    <!-- 设置扫描cn.itheima.entity.Student这个实体类 -->
    <context:component-scan base-package="cn.itheima" use-default-filters="false">
    	<context:exclude-filter type="annotation"  expression="cn.itheima.entity.Student"/>
    </context:component-scan>
    
  • spring4.x提供的依赖注入

    <!-- 2.泛型依赖注入spring4.x提供的 
    	详解:(1)我们创建BaseDao<T>类,又创建了BaseService<T>
    		(2)我们在BaseService<T>中注入BaseDao<T>
    		(3)我们创建一个类StudentService继承BaseService,我们又创建了一个类StudentDao继承BaseDao,并将创建的对象注入IOC容器中
    		(4)这样一来我们发现StudentDao自动注入到了StudentService中
    -->
    
  • 手写实现jdk代理类

    /**
     * 手动实现jdk代理
     */
    public class MyProxy implements InvocationHandler{
    	private Object target;
    	
    	public MyProxy(Object target) {
    		this.target=target;
    	}
    	
    	@Override
    	public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
    		//设置前置执行的内容
    		System.out.println("代理前置方法执行!");
    		//执行方法
    		Object result = method.invoke(target, args);
    		//设置后置执行的内容
    		System.out.println("代理后置方法执行!");
    		//返回结果
    		return result;
    	}
    	
    	public Object getInstance() {
    		//1.获取类加载器
    		ClassLoader loader=target.getClass().getClassLoader();
    		//2.获取类接口
    		Class<?>[] interfaces=target.getClass().getInterfaces();
    		return Proxy.newProxyInstance(loader, interfaces, new MyProxy(target));
    		
    	}
    }
    
    
  • 使用Spring实现代理(基于注解)

    <!-- 4.使用spring中的 aop实现代理(基于注解)
    		实现过程:(1)定义一个类,在此类上加上@Aspectj注解,声明这是一个切面类,还需要将它加入IOC容器中
    			       (2)给自定义类的方法添加@Before和@After注解,设置对应的切入点
    			       (3)将需要代理的类加入IOC容器中
    			       (4)这样我们就直接从IOC容器中获取需要的对象
     -->
    <!-- 开启aspectj注解支持 -->
    <aop:aspectj-autoproxy/>
    
    /**
     * 自定义切面类
     */
    @Aspect//生命当前类为切面类
    @Component//将当前切面类加入IOC容器中
    public class SpringAop {
    	
    	/**
    	 * 1.Before前置通知,括号内的参数需要设置切入点(第一个被执行)
    	 * 		(1)(完整写法=方法权限+方法返回值+复制方法全路径)
    	 * 		(2)可以将方法方法修饰符和方法返回值省略到,最终只要写一个*就可以代替两个东西
    	 * 		(3)对于方法的参数问题,如果不考虑参数问题写(..)
    	 * 		(4)设置JoinPoint这个参数的目的:为了获取执行的方法名,这个参数会被自动注入
    	 */
    	@Before("execution(public void cn.itheima.dao.impl.UserDaoImpl.*(..))")
    	public void before(JoinPoint joinPoint) {
    		//获取方法名
    		String methodName = joinPoint.getSignature().getName();
    		//获取参数
    		Object[] args=joinPoint.getArgs();
            
    		System.out.println("开始执行"+methodName+"这个方法"+"参 数"+Arrays.asList(args));
    	}
    	/**
    	 * 2.After后置通知(不管是否发生异常都执行,类似finally中的处理),括号内的参数同上(第二个被执行)
    	 */
    	@After("execution(public void cn.itheima.dao.impl.UserDaoImpl.*(..))")
    	public void after(JoinPoint joinPoint) {
    		//1.获取方法名
    		String methodName = joinPoint.getSignature().getName();
    		//2.获取参数
    		Object[] args = joinPoint.getArgs();
    		System.out.println("方法结束执行"+methodName+"这个方法"+"参数"+Arrays.asList(args));
    	}
    		
    	/**
    	 * 3.AfterReturning(返回通知):方法执行完成后执行(第三个被执行)
    	 * 		(1)returning属性值一定要和下面括号内的参数一致
    	 * 		(2)如果当前方法有返回值,这个时候result就为方法返回值
    	 */
    	@AfterReturning(pointcut="execution(public void cn.itheima.dao.impl.UserDaoImpl.*(..))",returning="result")
    	public void afterRuning(JoinPoint joinPoint,Object result) {
    		System.out.println("返回通知结果:"+result);
    	}
    	
    	/**
    	 * 4.异常通知:在方法发生异常的时候执行(出现异常时候执行)
    	 * 		(1)throwing的属性值一定要和下面括号内的参数一致
    	 */
    	@AfterThrowing(pointcut="execution(public void cn.itheima.dao.impl.UserDaoImpl.*(..))",throwing="e")
    	public void afterThrowing(JoinPoint joinPoint,Exception e) {
    		System.out.println("出现异常:"+e);
    	}
    		
    	 /**
    	  * 5.环绕通知:相当于动态代理的全过程(贯穿整个过程)
    	  * 		(1)ProceedingJoinPoint这个对象可用获取方法名,以及和方法有关的其他东西
    	  */
    	@Around(value="execution(public void cn.itheima.dao.impl.UserDaoImpl.*(..))")
    	public void around(ProceedingJoinPoint pjoinPoint) {
    		
    	}
    	
    	/**
    	 * 6.声明切入点表达式
    	 * 		作用:实现切入点表达式的复用,其他方法只需要在注解括号内心写("pointcut()")
    	 */
    	@Pointcut("execution(public void cn.itheima.dao.impl.UserDaoImpl.*(..))")
    	public void pointcut() {};
    	
    	/**
    	 * 7.切面的优先级
    	 * (1)添加@Order注解指定切面的优先级
    	 * 		eg:@Order(value),value值越小优先级越高,默认值最大,优先级最低
    	 */
    
  • 使用spring实现代理(基于xml)

    <!-- 5.基于xml的aop配置(基于xml) -->
    
    <!-- 1.实例化切面类 -->
    <bean class="cn.itheima.aop.SpringAop" id="springAop"></bean>
    
    <!-- 2.基于xml的配置AOP -->
    <aop:config>
    	<!-- 设置切入点 -->
    	<aop:pointcut expression="execution(* cn.itheima.dao.impl.UserDaoImpl.*(..))"       id="pointcut"/>
    	<!-- 配置切面 -->
    	<aop:aspect ref="springAop">
            <!-- 配置对应的前置方法 -->
    		<aop:before method="before" pointcut-ref="pointcut"/>
            <!-- 配置其他方法:after、after-returning -->
    	</aop:aspect>
    </aop:config>
    
    <!-- 3.创建要被代理的类实例 -->
    <bean class="cn.itheima.dao.impl.UserDaoImpl" id="userDao"></bean>
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值