qaq 面向注解编程真难学
三层架构
- Controller:控制层。接收请求,响应数据
- Service:业务逻辑层。处理具体的业务逻辑
- Dao:数据访问层(Data Access Object)(持久层),负责数据访问操作
分层解耦
- 控制反转(IOC)(Inversion Of Control):对象的创建控制权由程序自身转移到外部(容器)
- 依赖注入(DI)(Dependency Injection):容器为应用程序提供运行时所依赖的资源
- Bean对象:IOC容器中创建、管理的对象
@Component//将当前类交给IOC容器管理,成为IOC容器中的bean
public class EmpServiceA implements EmpService {
@Autowired//运行时,IOC容器会提供这个类型的bean对象,并赋值 - 依赖注入
private EmpDao empDao;
...
}
Bean的声明
@Component
:不属于下面三类的时候用@Controller
:标注在控制器类上@Service
:标在业务类上@Repository
:标在数据访问类上
注意:
- 声明bean的时候,可以通过value属性指定bean的名字,没指定的话默认为类名首字母小写
- springboot集成web开发的时候,声明控制类bean只能用@Controller
组件扫描
声明的注解,需要被组件扫描注解@ComponentScan扫描才会生效
@ComponentScan注解没有显示配置,实际上已经包含在启动类声明注解@SpringBootApplication,默认扫描范围是启动类所在包及其子包
可以自行声明注解@ComponentScan来管理扫描路径(不推荐)
- 在启动类前加
@ComponentScan({"dao","com.hxy"})
- 因为会把默认的取代,所以需要加上原来的包
- 在启动类前加
Bean注入
@Autowired默认按照类型注入,若存在多个相同类型的bean,会报错
解决
@Primary 加在想要生效的类前
@Primary @Service public class EmpServiceA implements EmpService { //... }
@Qualifier 加在@Autowired前,类名首字母小写
@Autowired @Qualifier("empServiceA") private EmpService empService;
@Resource 加载要注入的位置,替换@Autowired ,按照名称注入
@Resource(name = "empServiceB") private EmpService empService;