三层架构
controller:只负责接收请求,响应数据----调用Service层业务
而service只处理业务逻辑,具体数据要通过Dao层获取
Dao将数据返回给Service进行处理,再将结果返回给Controller层,然后响应给前端
控制反转、依赖注入
背景:
Controller耦合Service,一旦service名称改变,就需要手动去controller层改动代码
解决方案
private EmpService empService = new EmpServiceA();
//1.改为,不能直接用会报空指针异常。
private EmpService empService;
//2.还需把new EmpServiceA()对象放在一个容器里,用到哪个对象就从容器中查询
问题一
对象如何交给容器管理?
答:控制反转 IOC
对象的创建控制权由程序自身转移到外部容器
问题二
容器如何为程序提供所需要的资源对象?
答:依赖注入 DI
容器为应用程序提供运行时所依赖的资源
Bean对象
IOC容器中创建、管理的对象,称之为bean
如何实现IOC&DI
- 将Service层和Dao层的实现类,交给IOC容器管理,成为IOC容器中的bean对象----@Component
- 为Controller和Service注入运行时依赖的对象----@Autowired
运行时,IOC容器会提供该类型的bean对象,并赋值给该变量
一般使用@RestController、@Service、@Repository在三层上
如果有其他类(不属于这三层,比如:工具类)需要加到IOC容器,这时可以使用@Component
注意:
@Repository(value=“daoB”) //设置EmpDaoB别名
注意:
- 使用@Autowired注解:默认按照类型装配。一个接口只能对应一个IOC容器管理的bean对象。如果有两个,dao—daoA,daoB就会报错,不能完成自动装配
- 解决方案:
如果需要存在多个相同的bean----@Primary/@Qualifier/@Resource
@Primary:在其中一个实现类上加,设置这个实现类的优先级先注入,自动注入这个类
@Qualifier:指定bean的名字(spring提供)
@Resource:指定bean对象。(jdk提供)
- @Autowired和@Resource区别
Bean组件扫描
1.手动----@ComponentScan,让Springboot能够扫描到(不推荐!!!)
用这个之后需要指定扫描的包,以及启动类所在的包(会覆盖默认的@SpringbootApplication,需要重新指定)
2.把所有类放在启动类所在的包/子包下