当前位置: 首页 > 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/176967/

相关文章:

  • 婚礼婚庆网站建设南宁网站建设公司招聘
  • 微网站收费标准制作公众号网站开发
  • 专业柳州网站建设公司织梦网站档目管理空白
  • 电商平台网站开发过程wordpress怎么在虚拟主机上搭建
  • 网站建设主机端口如何进行网站调试
  • 东莞企业网站制作怎么做木樨园网站建设公司
  • 网站建设前期团队建设百度指数资讯指数是指什么
  • 青岛网站建设一青岛博采网络微信哪家公司开发的
  • 做app和网站哪个比较好公司网站建设费用多少
  • 小程序建站平台网站备案由别人代
  • 网站 案例怎么写网站建设的说明
  • 礼品网站制作wordpress 归档链接
  • 外贸网站建站用什么网站在建设时不容忽略的一些细节
  • 网站优化套餐做网站每天都要花钱么
  • dw做的网站设计免费客户管理软件哪个好用
  • 网站备案找回微信自助下单小程序怎么弄
  • 个人网站建设公司字体样式 网站
  • 263网站建设百度网址大全免费下载
  • 做番号类网站违法吗网站开发合作协议书
  • 做网站至少多少钱国内成熟的crm系统
  • 电子商务网站建设论文开题报告建筑资源网站
  • 网站内页全是404百度应用市场
  • 在那个网站可以搜索做凉菜视频推广型网站建设电话
  • 上海招标网站招标采购平台
  • 网站建设3合1什么意思seo zac
  • 什么是网站托管厦门做企业网站比较好的公司
  • 浏阳市住房和城乡建设局的网站portfolio做网站
  • 企业网站推广服务做网站可行性分析
  • 网站安全防黑联盟大庆市建设局宫方网站
  • 做兼职设计去哪个网站上门做网站哪里有