##Controller Service Dao(mapper)
软件设计:高内聚 低耦合
Controller 调用Service, Service调用 DAO 模块之间耦合
如果要从EmpServiceA切换到EmpServiceB,Controller代码也要修改
new EmpServiceB
分层接耦
容器中放EmpServiceA, Controller需要对象去容器中找
如果要将实现类由EmpServiceA 切换为EmpServiceB,可以基于B对象在容器中创建一个对象,即使Service中实现类发生变化,Controller代码也不需要改动
1.对象怎么交给容器管理
①类交给IOC容器管理,在类上加注解 @Component
2.容器怎么为程序提供依赖的资源
②Controller需要 empservice对象,给empService加上@Autowired注解
此时如果要切换实现类:EmpServiceA 切换到EmpServiceB,将A上面的 //@Component注释掉就可以
保留EmpServiceB上的@Component
Java中的Bean
Controller Service Repository 将对象交给IOC容器管理,默认封装了Component注解
不能用上面三个注解标识,就交给Component,典型的使用场景是工具类
- 申明Bean时候,可以通过注解中的value属性指定Bean的名字,没有指定Value属性,Bean名字默认类名首字母小写
Bean的组件扫描
申明一个Bean,不一定会生效,设计到组件扫描的问题
启动类自动加上了组件扫描注解,默认扫描范围是启动类所在包及其子包,如果有些Bean不在这个目录下,启动会失败,b比如dao代码
解决方法:自己加上ComponentScan(不推荐)
推荐:将所写的代码全部放到启动类及其子包下面
依赖注入
- ① AutoWired
有两个EmpService的Bean,EmpServiceA,EmpServiceB:使用哪个?
程序启动时就报错:
解决方法:
(1)@Primary 设置优先级,想要哪个Bean生效,就在哪个Bean上加@Primary
(2)@Autowired配合@Qualifier(“empServiceA”), 加上bean的名字,默认类名首字母小写
Autowired默认按照类型注入
@Resource默认按照名称注入
jdk提供的