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

【玩转23种Java设计模式】结构型模式篇

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

【玩转23种Java设计模式】结构型模式篇

@Slf4j

public class MapperFactoryBean implements FactoryBean {

private Class mapperInterface;

public MapperFactoryBean(Class mapperInterface) {

this.mapperInterface = mapperInterface;

}

@Override

public T getObject() throws Exception {

InvocationHandler handler = (proxy, method, args) -> {

Select select = method.getAnnotation(Select.class);

log.info(“query sql:{}”, select.value());

log.info(“param:{}”, args[0]);

return “1, 张三(模拟从数据库查询的返回)”;

};

return (T) Proxy.newProxyInstance(this.getClass().getClassLoader(), new Class[]{mapperInterface}, handler);

}

@Override

public Class getObjectType() {

return mapperInterface;

}

@Override

public boolean isSingleton() {

return true;

}

}

MapperFactoryBean 通过继承 FactoryBean ,提供bean对象,也就是方法T getObject() 。在方法 getObject() 中提供类的代理以及模拟对sql语句的处理,这里包含了用户调用dao层方法时候的处理逻辑。

[](()4、Bean定义注册到Spring容器(RegisterBeanFactory)

public class RegisterBeanFactory implements BeanDefinitionRegistryPostProcessor {

@Override

public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {

GenericBeanDefinition beanDefinition = new GenericBeanDefinition();

beanDefinition.setBeanClass(MapperFactoryBean.class);

beanDefinition.setScope(“singleton”);

beanDefinition.getConstructorArgumentValues().addGenericArgumentValue(IUserDao.class);

BeanDefinitionHolder definitionHolder = new BeanDefinitionHolder(beanDefinition, “userDao”);

BeanDefinitionReaderUtils.registerBeanDefinition(definitionHolder, registry);

}

@Override

public void postProcessBeanFactory(ConfigurableListableBeanFactory configurableListableBeanFactory) throws BeansException {

}

}

我们将代理的bean交给spring容器管理,以方便我们获取到代理的bean。这里是在spring中关于⼀个bean注册过程的源码。GenericBeanDefinition ,用于定义⼀个bean的基本信息,也包括可以透传给构造函数信息,最后使用BeanDefinitionReaderUtils.registerBeanDefinition,进行bean的注册,也就是注册到DefaultListableBeanFactory 中。

[](()5、spring-mybatis.xml

xmlns:xsi=“http://www.w3.org 《一线大厂Java面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义》无偿开源 威信搜索公众号【编程进阶路】 /2001/XMLSchema-instance”

xsi:schemaLocation="http://www.springframework.org/schema/beans

http://www.springframework.org/schema/beans/spring-beans.xsd">

[](()6、测试

@SpringBootTest

public class ApplicationTests {

@Test

public void test() {

BeanFactory beanFactory = new ClassPathXmlApplicationContext(“spring-mybatis.xml”);

IUserDao userDao = beanFactory.getBean(“userDao”, IUserDao.class);

String res = userDao.selectById(1);

System.out.println("res = " + res);

}

}

控制台输出:

query sql:select * from user where id = #{id}

param:1

res = 1, 张三(模拟从数据库查询的返回)

[](()三、总结


[](()1、优点
  • 职责清晰。代理模式能将代理对象与真实被调用的目标对象分离,真实的角色就是实现实际的业务逻辑,不用关心其他非本职责的事务。

  • 高扩展性。一定程度上降低了系统的耦合度,扩展性好。

  • 代理对象可以在客户端和目标对象之间起到中介的作用,这样起到了中介的作用和保护了目标对象的作用。

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

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

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