当前位置: 首页 > news >正文

如何做网站电话太原网站推广只选中联传媒

如何做网站电话,太原网站推广只选中联传媒,公司做推广做网站好还是,开发公司土建工程师绩效考核目录 一、前言二、案例1 代码2 自定义代理类【静态代理】2.1 一个接口多个实现,到底注入哪个依赖呢?2.1.1 Primary注解2.1.2 Resource注解(指定name属性)2.1.3 Qualifier注解 2.2 面向接口编程2.3 如果没接口咋办呢?2.…

目录

  • 一、前言
  • 二、案例
    • 1 代码
    • 2 自定义代理类【静态代理】
      • 2.1 一个接口多个实现,到底注入哪个依赖呢?
        • 2.1.1 @Primary注解
        • 2.1.2 @Resource注解(指定name属性)
        • 2.1.3 @Qualifier注解
      • 2.2 面向接口编程
      • 2.3 如果没接口咋办呢?
        • 2.3.1 示例
        • 2.3.2 继承
    • 3 动态代理

一、前言

  • 在【对AOP的理解】中,提到过代理模式。
  • 本篇文章进一步谈谈我对代理模式的理解。

二、案例

1 代码

@RestController
@RequestMapping("/user")
public class UserController {@Resourceprivate UserService userService;@PostMapping("/login")public UserVO login(@RequestBody LoginRequest loginRequest) {UserDO userDO = userService.login(loginRequest.getUsername(), loginRequest.getPassword());return UserVO.builder().username(userDO.getUsername()).password(userDO.getPassword()).build();}
}public interface UserService {UserDO login(String username, String password);
}@Service
public class UserServiceImpl implements UserService {@Resourceprivate LoginProcess loginProcess;@Overridepublic UserDO login(String username, String password) {return loginProcess.login(username, password);}
}@Component
public class LoginProcess {public UserDO login(String username, String password) {try {Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}return new UserDO().setUsername("forrest").setPassword("123456");}
}
  • 我们想知道“登录”过程耗费的时间,即loginProcess.login(username, password);耗费的时间。
  • 我们希望通过自定义代理类来实现。

2 自定义代理类【静态代理】

@Slf4j
@Service
public class UserProxyServiceImpl implements UserService {@Resourceprivate UserServiceImpl userServiceImpl;@Overridepublic UserDO login(String username, String password) {long startTimestamp = System.currentTimeMillis();UserDO userDO = userServiceImpl.login(username, password);log.info("login cost {} ms", System.currentTimeMillis() - startTimestamp);return userDO;}
}
  • 如果这么写,很显然,启动时会报错:No qualifying bean of type 'structure.proxy.example3.service.UserService' available: expected single matching bean but found 2: userProxyServiceImpl,userServiceImpl
@RestController
@RequestMapping("/user")
public class UserController {@Resourceprivate UserService userService;...
}
  • UserService是接口,有两个实现类,Spring不知道到底要注入哪个bean,因此报错了。

2.1 一个接口多个实现,到底注入哪个依赖呢?

  • 在Spring框架中,当存在多个相同类型的bean时,可以通过三种主要方式来指定注入哪一个bean:使用@Primary注解@Resouce注解(指定name属性)@Qualifier注解
2.1.1 @Primary注解
@Slf4j
@Service
@Primary
public class UserProxyServiceImpl implements UserService {...
}
2.1.2 @Resource注解(指定name属性)
@RestController
@RequestMapping("/user")
public class UserController {@Resource(name = "userProxyServiceImpl")private UserService userService;...
}
  • IDEA的友好提示:
    在这里插入图片描述
  • 妈妈再也不担心我注不对bean了:)
2.1.3 @Qualifier注解
  • @Resource(name = “userProxyServiceImpl”)相当于:
@Autowired
@Qualifier("userProxyServiceImpl")
@RestController
@RequestMapping("/user")
public class UserController {@Autowired@Qualifier("userProxyServiceImpl")private UserService userService;...
}
  • 同样,IDEA提供了友好的提示:
    在这里插入图片描述

2.2 面向接口编程

  • 我们通过改变使用的bean:从UserServiceImpl换成了UserProxyServiceImpl,就新增了一些逻辑,例如,记录“登录”消耗的时间。
  • 对调用者完全是无感的。
    • 这就是通过接口来解耦了调用方和实现方:调用方–接口–实现方。

2.3 如果没接口咋办呢?

2.3.1 示例
@RestController
@RequestMapping("/user")
public class UserController {@Resourceprivate UserServiceImpl userService;@PostMapping("/login")public UserVO login(@RequestBody LoginRequest loginRequest) {UserDO userDO = userService.login(loginRequest.getUsername(), loginRequest.getPassword());return UserVO.builder().username(userDO.getUsername()).password(userDO.getPassword()).build();}
}@Service
public class UserServiceImpl {@Resourceprivate LoginProcess loginProcess;public UserDO login(String username, String password) {return loginProcess.login(username, password);}
}
2.3.2 继承
@RestController
@RequestMapping("/user")
public class UserController {
//    @Resource
//    private UserServiceImpl userService;@Resourceprivate UserProxyServiceImpl userService;...
}@Slf4j
@Service
public class UserProxyServiceImpl extends UserServiceImpl {@Resourceprivate UserServiceImpl userServiceImpl;@Overridepublic UserDO login(String username, String password) {long startTimestamp = System.currentTimeMillis();UserDO userDO = userServiceImpl.login(username, password);log.info("login cost {} ms", System.currentTimeMillis() - startTimestamp);return userDO;}
}
  • 很显然,所有用到UserServiceImpl的地方,都要换成UserProxyServiceImpl。麻烦啊!
  • 因此,如果依赖的实现方可能变化,一定要面向接口编程啊!
    • 如果第三方没提供接口,也要自定义一个接口来解耦调用方和实现方!

3 动态代理

  • 详见:对AOP的理解
http://www.yayakq.cn/news/93272/

相关文章:

  • 简述建设网站的步骤6erp企业管理系统平台
  • 新能源 东莞网站建设重庆智能网站建设费用
  • 如何查询网站是否有做404百度广告搜索引擎
  • wordpress 微博链接地址网站推广专家十年乐云seo
  • 企业的网站公告怎么制作wordpress自定义注册插件
  • 建设电影网站的教程现在有没有免费的网站空间
  • 的建站公司华为云怎么建网站
  • 太平洋手机网郑州seo优化外包顾问阿亮
  • 网站开发工具书中国建设银行北京分行官网站
  • php mysql网站开发实例为什么我的网站做不起来
  • 做外贸a货网站专注昆明网站推广
  • 长沙建设网站企业网站开发个人简介范文
  • 网站平台做推广方案教你如何建设网站
  • 东莞百度seoseo在线工具
  • 网站免费正能量软件下载昆明建站网站资讯平台
  • 单页网站怎么做竞价中国室内设计联盟官网首页
  • 搜房网站建设分析广州建论坛网站
  • dedecms 5.7 关闭网站咪豆建站
  • 大连网站制作信ls15227设计网站建设图片
  • 东莞做网站优化哪家好翔安区建设局网站
  • 百度站长平台删站移动网站怎么建设
  • wordpress 网站制作拐个娇妻做晚餐在哪个网站连载呢
  • 网站开发和app开发哪个难二级目录做网站
  • 厦门网站定制有好的学网站建设的书吗
  • 网站建设毕业设计中期进度报告成都商城网站制作
  • 重庆建设信息网站查询比亚迪唐100使用了哪些网络营销方式
  • cms网站访问人数网站主体负责人和网站负责人
  • 梅州网站建北京微信网站制作电话
  • 福州网页模板建站wordpress 推送公众号
  • 自己做网站出口延安网站建设报价