目录
一、内聚和耦合
二、分层解耦
三、具体实现
四、bean的组件扫描
五、bean注入
一、内聚和耦合
在了解分层解耦的概念之前我们我们要去先了解一下内聚和耦合。内聚:通常将的是软件中各个模块之间的功能联系。耦合衡量软件各个模块之间的依赖、关联的程度。一个项目中各个模块之间相互联系越紧密则耦合性越高,模块的独立性就越低,反之亦然。软件设计的原则:高内聚低耦合。在上一篇文章我们搭建了一个简单的三层架构。
实现了service层和dao层的耦合。
实现了service和controller层的耦合。
二、分层解耦
从上面我们可以看出各个模块之间存在一些耦合,我们应该如何进行解耦呢?如果直接删除上述高亮显示代码会报错,我们会提供一个容器去存储创建的对象,我们从容器中取需要的对象。对象该如何交给容器进行管理?容器怎么提供所依赖的资源?涉及到一些新的概念:控制反转、依赖注入和Bean对象。
控制反转:Inversion of Control,简称IOC。对象创建控制权由程序自身转移到外部(Spring容器)。
依赖注入:Dependency injection,简称DI。容器为应用程序提供运行时,所依赖的资源。
Bean对象:IOC 容器中创建、管理的对象。
三、具体实现
@Component:指定一个普通的Bean,可以作用在任何层次。
@Controller:指定一个控制器组件Bean。
@Service:指定一个业务逻辑组件Bean。
@Repository:指定一个数据访问组件Bean。
@Scope:指定 Bean 实例的作用域。
@Value:指定Bean 实例的注入值
在声明bean 的时候,可以通过value属性来指定Bean的名字,如果没有指定,默认为类名首字母小写。在springboot集成web开发中,声明控制器bean只能用@controller。
四、bean的组件扫描
前面说到的bean的四大注解(@Repository、@Service、@Controller和@Component),要想生效还需要被注解@ComponentScan扫描。@ComponentScan注解虽然没有显示配置,但是实际上已经包含在启动类声明注解@SpringBootApplication中,默认的扫描范围是启动类所在包(com.example.demo)及其子包。
如果需要扫描的com.example.demo之外的包,可以通过@ComponentScan进行设置@ComponentScan({“dao”,"com.example.demo"}),这种方式不推荐使用。推荐放在启动类所在包。
五、bean注入
@Autowired:指定要自动装配的对象。默认按类型进行装配,换一句话说就是去IOC容器中找指定类型的bean对象,然后完成注入。如果有两个类型一样的bean会报错。
可以通过一下几种方式进行解决:
@Primary:用于标记一个或多个Bean作为首选的候选者。
@Qualifier:指定要自动装配的对象名称,通常与Autowired 联合使用。
@Resource:指定要注入的对象,默认根据名称进行区分。
@Autowired是spring框架提供的注解,而@Resource是JDK提供的注解。@Autowired默认是按照类型注入,而@Resource默认是按照名称注入。