栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

【Spring】(3)

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【Spring】(3)

文章目录
      • 组件
      • 衍生注解
      • 作用域
      • JavaConfig实现配置
      • 动态代理
      • AOP
          • 方式一:使用spring的接口
          • 方式二:使用自定义类
          • 方式三:使用注解实现

spring4之后,要使用注解开发,需要导入AOP

组件


使用组件注解的例子:

//这个类变成组件,可以被component-scan扫描到,等价于······
@Component
public class User {
	@Value("小槑")
    public String name;
}

这样,User类的bean就已经被加载进容器了。

衍生注解

@Repository仓库,用于给 dao 层添加的注解,使其变为组件。
@Service服务,用于给 service 层添加的注解,使其变为组件。
@Controller控制器,用于给 controller 层添加的注解,使其变为组件。

作用域

@Scope,可加参数@Scope("singleton"),singleton 为单例模式,prototype 为原型模式

JavaConfig实现配置

定义一个类,用注解@Configuration标记,这就等同于配置文件的······,@Bean就相当于······,方法名就是 id 返回类型是注册的 bean 的类。

@Configuration
public class MyConfig {
    @Bean
    public User getUser() {
        return new User();
    }
}

扫描包加入组件也有注解@ComponentScan("包名")

动态代理

使用InvocationHandler接口和Proxy类。
实现InvocationHandler接口做三件事,一是定义一个私有变量,用来接收被代理的对象,二是编写一个返回代理对象的方法,方法返回Proxy.newProxyInstance()方法产生的对象,三是实现invoke()方法,完成真正代理做的事。。

当想使用代理时,通过setter方法或者构造器,向InvocationHandler的实现类传入被代理的对象,再通过实现类的获取代理对象的方法,获取一个对象,最后通过这个对象调用被代理对象想要实现的接口。

AOP

某一层实现横向拓展,类似于动态代理的效果。
依赖:


    org.aspectj
    aspectjweaver
    1.9.4

切面 aspect:横切关注点 被模块化 的特殊对象。即,它是一个类。
通知 advice:切面必须要完成的工作。即,它是类中的一个方法。
目标 target:被通知对象。
代理 proxy:向目标对象通知后创建的对象。
切入点 pointcut:切面通知 执行的“地点”的定义。
连接点 jointpoint:与切入点匹配的执行点。

方式一:使用spring的接口

aop配置(输入自动补全config就会自动导入)





设置切入点:任意修饰词和返回值,com.zxt.service.UserServiceImpl类下的所有方法,参数任意
*表示通配符,..表示参数的通配符




    
    

增加环绕,这里是把 log 这个bean,切入到 pointcut 这个切入点,由于实现了接口,会自己判断在前还是后环绕。


    
    
    
    

方式二:使用自定义类



    
    
        
        
        
        
        
    

  1. 先把切面增加的操作注册bean
  2. 配置:aop:aspect是配置切面,不再只是一个点,因为前后置的内容都是自定义的,需要把整体放入一个切面切入。
  3. 配置切点
  4. 配置切点的前置和后置
方式三:使用注解实现

编写切面,@Aspect标记切面,@Before(value)标记为前置方法 value处填aspectj语法,@After(value)同理。

//方式三:使用注解实现aop
@Aspect //标注这个类是一个切面
public class AnnotationPointCut {
    @Before("execution(* com.zxt.service.UserServiceImpl.*(..))")
    public void before(){
        System.out.println("=====方法执行前=====");
    }

    @After("execution(* com.zxt.service.UserServiceImpl.*(..))")
    public void after(){
        System.out.println("=====方法执行后=====");
    }
}

配置上下文





除此之外,还有个注解@Around

//在环绕增强中,我们可以给定一个参数,代表我们要获取处理切入的点
@Around("execution(* com.zxt.service.UserServiceImpl.*(..))")
public void around(ProceedingJoinPoint jp) throws Throwable {
    System.out.println("环绕前");

    Signature signature = jp.getSignature();//获得签名 就是方法本体到底叫什么
    System.out.println("signature:"+signature);
    //执行方法
    Object proceed = jp.proceed();

    System.out.println("环绕后");

//        System.out.println(proceed);
}

ProceedingJoinPoint jp参数叫执行点,就是切入点在执行时对应的叫法,通过这个参数可以手动控制方法在什么时候执行,jp.proceed();就是手动让方法执行,在这条语句前后执行前置和后置。
环绕的前置和后置,与普通的前置和后置是并发的,操作先后由cpu调度决定。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/866442.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号