一、静态代理模式
代理模式:客户端直接使用的都是代理对象,不知道真实对象是谁,此时代理对象可以在客户端和真实对象之间起到中介的作用。
1、代理对象完全包含真实对象,客户端使用的都是代理对象的方法,和真实对象没有直接关系;
2、代理模式的职责:把不是真实对象该做的事情从真实对象上撇开——职责清晰;
静态代理(proxy):
在程序运行前就已经存在代理类的字节码文件,代理对象和真实对象的关系在程序运行前就确定了。
二、代码示例
接口及其实现类
public interface IEmployeeService {
void save(Employee e);
void update(Employee e);
}
@Service("target")
public class EmployeeServiceImpl implements IEmployeeService{
@Autowired
private IEmployeeDao employeeDao ;
@Override
public void save(Employee e) {
employeeDao.save(e);
}
@Override
public void update(Employee e) {
employeeDao.update(e);
}
}
事物管理器
@Component("txManager")
public class TransactionManager {
public void begin(){
System.out.println("事物开启。。。。。");
}
public void commit(){
System.out.println("事物提交。。。。。");
}
public void rollback(){
System.out.println("事物回滚。。。。。");
}
}
静态代理类
**
* EmployeeServiceImpl 的代理类
*/
@SuppressWarnings("all")
@Component("proxy")
public class EmployeeServiceImplProxy implements IEmployeeService {
// 用接口,面向接口编程
@Autowired
private IEmployeeService target;
// 事物管理器
@Autowired
@Qualifier("txManager")
private TransactionManager txManager;
@Override
public void save(Employee e) {
txManager.begin();
try {
target.save(e);
txManager.commit();
} catch (Exception e1) {
txManager.rollback();
e1.printStackTrace();
}
}
@Override
public void update(Employee e) {
txManager.begin();
try {
target.update(e);
txManager.commit();
} catch (Exception e1) {
txManager.rollback();
e1.printStackTrace();
}
}
}
配置文件
<?xml version="1.0" encoding="UTF-8"?>
<beans
xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
">
<!-- 解析autowired,resource,qualifier-->
<context:annotation-config />
<!--去哪些包下面去扫描组件-->
<context:component-scan base-package="com.shenzhenair.day02.common" />
<context:component-scan base-package="com.shenzhenair.day02.static_proxy" />
<!--配置事物管理器-->
<!--<bean name="txManager" class="com.shenzhenair.day02.common.TransactionManager" />-->
<!--配置dao-->
<!--<bean name="employeeDao" class="com.shenzhenair.day02.common.dao.impl.EmployeeDaoImpl" />-->
<!--配置service-->
<!--<bean name="employeeService" class="com.shenzhenair.day02.common.service.impl.EmployeeServiceImpl" >-->
<!--<property name="employeeDao" ref="employeeDao" />-->
<!--</bean>-->
<!--配置代理-->
<!-- <bean name="employeeServiceImplProxy" class="com.shenzhenair.day02.static_proxy.EmployeeServiceImplProxy" >
<property name="txManager" ref="txManager" />
<!–配置真实的代理对象,隐藏在代理对象内部,外界无法进行访问–>
<property name="target" >
<bean class="com.shenzhenair.day02.common.service.impl.EmployeeServiceImpl" >
<property name="employeeDao" ref="employeeDao" />
</bean>
</property>
</bean>-->
</beans>
测试类:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:com/shenzhenair/day02/static_proxy/staticProxy.xml")
public class EmployeeProxyTest {
@Autowired
private IEmployeeService proxy;
@Test
public void testSave(){
proxy.save(new Employee());
}
}