spring代理对象都是代理对象吗
时间:2022-07-22
本文章向大家介绍spring代理对象都是代理对象吗,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
最近看到一个比较有意思的问题,springIoc 产生的对象是否都是代理对象?答案是:spring ioc默认的都是原生对象 只有通过aop增强的对象才是代理对象。有@Transactional 注解或者配置文件:
<aop:config>
<aop:pointcut id="txPointcut" expression="execution(* com..service.impl.*.*(..))" />
<aop:advisor pointcut-ref="txPointcut" advice-ref="txAdvice" />
</aop:config>
说到代理,又分为静态代理和动态代理。
静态代理
首先定义一个接口:
public interface Iuser {
void save();
}
接口实现:
public class UserService implements Iuser {
@Override
public void save() {
System.out.println("save user 1");
}
}
代理类:
public class UserServiceProxy implements Iuser{
Iuser iuser;
public UserServiceProxy(Iuser iuser) {
this.iuser = iuser;
}
@Override
public void save() {
System.out.println("save user before");
iuser.save();
System.out.println("save user after");
}
测试:
public static void main(String[] args) {
Iuser iuser = new UserService();
// 注入原生对象
UserServiceProxy userServiceProxy = new UserServiceProxy(iuser);
userServiceProxy.save();
}
输出:
save user before
save user 1
save user after
优点:
- 易于理解和实现
- 代理类和真实类的关系是编译期静态决定的,和下文马上要介绍的动态代理比较起来,执行时没有任何额外开销
缺点:
每一个真实类都需要一个创建新的代理类。
动态代理
实现方式有两种,一个是JDK原生动态代理这个必须是接口,还有一种就是cglib来实现。
还有几个比较经典的面试题:
- 一个类里面有transaction注解,在A方法里面调研B方法事务会不起作用?
这个就因为B方法是通过this调用的,this代表的是当前的原生对象,以至于事务不起作用。
2.为什么jdk动态代理必须基于接口 ?
生成的代理类继承了Proxy,由于java是单继承,所以只能实现接口,通过接口实现 从代理模式的设计来说,充分利用了java的多态特性,也符合基于接口编码的规范 。
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- Java——枚举基础应用总结(多例设计模式、Enum类、枚举的实际应用)
- Java——Annotation注解基本总结(简介、覆写、过期声明、压制警告)
- JavaWeb——一文快速入门BootStrap(栅格系统、全局CSS样式、组件、插件、基于BootStrap的官网案例实战)
- JavaWeb——XML入门详解(概述、语法、约束、Jsoup解析、Xpath解析)
- JavaWeb——CSS应用实例详解(概述、语法、选择器、属性、用户登录界面实例)
- JavaWeb——JavaScript精讲之事件监听机制与表单校验案例实战
- Java——扩展概念(匿名内部类、包装类、装箱与拆箱、数据类型的转换)
- Java——接口的基本总结(基本定义、使用接口定义标准、工厂设计模式、代理设计模式、抽象类与接口的区别)
- JavaWeb——HTML表单标签详解(input、label、select、textarea)
- Java——设计辅助概念(final关键字、对象多态性基本概念)
- JavaWeb——JavaScript精讲之DOM、BOM对象与案例实战(动态添加删除表格)
- JavaWeb——JavaScript精讲之ECMAScript标准(基本语法、JavaScript对象)
- JavaWeb——HTML基本标签详解及案例实战(文件标签、文本标签、图片标签、列表标签、链接标签、块标签、语义化标签、表格标签)
- JavaWeb——web概念概述(静态资源与动态资源)、HTML概念概述
- Java——内部类使用总结(基本概念、定义内部类、static定义内部类、方法中定义内部类)