静态代理
-
定义:
- 代理类代替被代理类去完成接口的调用。代理类和被代理类实现了相同的接口,他们之间的类关系是组合关系
- 实现:接口+组合关系
- 现实场景:租客、中介、房东或者商场卖家、代理长商、工厂
-
问题
-
有一个正常的功能:通过调用接口和接口实现类完成。
后来需要在该功能的基础之上增加一些其他操作,
还有个要求尽量不要修改源代码,就是那个实现类,以免发生错误。
于是使用了代理类来解决这个问题。
-
-
使用
-
请求调用接口,接口的实现类换成了代理类。被代理类作为代理类的属性,用来在代理类的方法中调用原来的方法,
代理类的方法中可以增加一些其他操作
-
package com.tf.study.service; public interface UserService { void getUser(); }
-
package com.tf.study.service.Impl; import com.tf.study.dao.UserDao; import com.tf.study.service.UserService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.stereotype.Service; /** * service 作为用户请求,调用接口UserDao */ @Service public class UserServiceImpl implements UserService { // 代理类userDaoProxy代替原来的被代理类userDaoImpl成为接口的实现类,完成接口的调用 @Autowired() // @Qualifier("userDaoImpl") 原来的接口实现类,由于功能增加操作,被代理类代替了 @Qualifier("userDaoProxy") private UserDao userDao; public void getUser() { userDao.getUser(); } }
-
package com.tf.study.dao; /** * 接口 */ public interface UserDao { void getUser(); }
-
package com.tf.study.dao.impl; import com.tf.study.dao.UserDao; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.lang.Nullable; import org.springframework.stereotype.Repository; import javax.annotation.Resource; /** * 代理类 * 代替被代理类完成接口的调用 */ @Repository public class UserDaoProxy implements UserDao { // 被代理类作为代理类的属性 // @Autowired @Qualifier("userDaoImpl") @Resource(name="userDaoImpl") private UserDao userDao; public void getUser() { System.out.println("增加的其他操作:比如权限校验"); userDao.getUser();// 调用原方法 System.out.println("增加的其他操作:比如记录日志"); } }
-
package com.tf.study.dao.impl; import com.tf.study.dao.UserDao; import org.springframework.stereotype.Repository; /** * 被代理类 * 源代码功能,尽量不要修改 */ @Repository public class UserDaoImpl implements UserDao { public void getUser() { System.out.println("返回一个当前用户A"); } }
-
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd"> <context:component-scan base-package="com"></context:component-scan> </beans>
-
test
import com.tf.study.service.UserService; import org.junit.Test; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class AnnotationTest { @Test public void test01(){ ApplicationContext applicationContext = new ClassPathXmlApplicationContext("beans.xml"); UserService userService = applicationContext.getBean("userServiceImpl", UserService.class); userService.getUser(); } }
-
pom.xml
-
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>Spring.Framerwork.Study</groupId> <artifactId>Spring_Framerwork</artifactId> <packaging>pom</packaging> <version>1.0-SNAPSHOT</version> <modules> <module>Study_Ioc_01</module> <module>Study_GUI</module> <module>study_design_pattern</module> <module>study_annotation</module> </modules> <dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>5.2.7.RELEASE</version> </dependency> <!-- https://mvnrepository.com/artifact/junit/junit --> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.13</version> <scope>test</scope> </dependency> <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.19</version> </dependency> </dependencies> </project>
-
-