苏州网站建设制作方案,百度搜索引擎关键词,河南中原建设公司网站,外贸建站系统源码3.3.2 IOC详解
通过IOC和DI的入门程序呢#xff0c;我们已经基本了解了IOC和DI的基础操作。接下来呢#xff0c;我们学习下IOC控制反转和DI依赖注入的细节。
3.3.2.1 bean的声明
前面我们提到IOC控制反转#xff0c;就是将对象的控制权交给Spring的IOC容器#xff0c;由…
3.3.2 IOC详解
通过IOC和DI的入门程序呢我们已经基本了解了IOC和DI的基础操作。接下来呢我们学习下IOC控制反转和DI依赖注入的细节。
3.3.2.1 bean的声明
前面我们提到IOC控制反转就是将对象的控制权交给Spring的IOC容器由IOC容器创建及管理对象。IOC容器创建的对象称为bean对象。
在之前的入门案例中要把某个对象交给IOC容器管理需要在类上添加一个注解Component
而Spring框架为了更好的标识web应用程序开发当中bean对象到底归属于哪一层又提供了Component的衍生注解 Controller 标注在控制层类上 Service 标注在业务层类上 Repository 标注在数据访问层类上 修改入门案例代码 Controller层
RestController //RestController Controller ResponseBody
public class EmpController {
Autowired //运行时,从IOC容器中获取该类型对象,赋值给该变量private EmpService empService ;
RequestMapping(/listEmp)public Result list(){//1. 调用service, 获取数据ListEmp empList empService.listEmp();
//3. 响应数据return Result.success(empList);}
} Service层
Service
public class EmpServiceA implements EmpService {
Autowired //运行时,从IOC容器中获取该类型对象,赋值给该变量private EmpDao empDao ;
Overridepublic ListEmp listEmp() {//1. 调用dao, 获取数据ListEmp empList empDao.listEmp();
//2. 对数据进行转换处理 - gender, jobempList.stream().forEach(emp - {//处理 gender 1: 男, 2: 女String gender emp.getGender();if(1.equals(gender)){emp.setGender(男);}else if(2.equals(gender)){emp.setGender(女);}
//处理job - 1: 讲师, 2: 班主任 , 3: 就业指导String job emp.getJob();if(1.equals(job)){emp.setJob(讲师);}else if(2.equals(job)){emp.setJob(班主任);}else if(3.equals(job)){emp.setJob(就业指导);}});return empList;}
}
Dao层
Repository
public class EmpDaoA implements EmpDao {Overridepublic ListEmp listEmp() {//1. 加载并解析emp.xmlString file this.getClass().getClassLoader().getResource(emp.xml).getFile();System.out.println(file);ListEmp empList XmlParserUtils.parse(file, Emp.class);return empList;}
} 要把某个对象交给IOC容器管理需要在对应的类上加上如下注解之一
注解说明位置ControllerComponent的衍生注解标注在控制器类上ServiceComponent的衍生注解标注在业务类上RepositoryComponent的衍生注解标注在数据访问类上由于与mybatis整合用的少Component声明bean的基础注解不属于以上三类时用此注解 查看源码 在IOC容器中每一个Bean都有一个属于自己的名字可以通过注解的value属性指定bean的名字。如果没有指定默认为类名首字母小写。 注意事项: 声明bean的时候可以通过value属性指定bean的名字如果没有指定默认为类名首字母小写。 使用以上四个注解都可以声明bean但是在springboot集成web开发中声明控制器bean只能用Controller。 3.3.2.2 组件扫描
问题使用前面学习的四个注解声明的bean一定会生效吗
答案不一定。原因bean想要生效还需要被组件扫描 下面我们通过修改项目工程的目录结构来测试bean对象是否生效 运行程序后报错 为什么没有找到bean对象呢 使用四大注解声明的bean要想生效还需要被组件扫描注解ComponentScan扫描 ComponentScan注解虽然没有显式配置但是实际上已经包含在了引导类声明注解 SpringBootApplication 中默认扫描的范围是SpringBoot启动类所在包及其子包。 解决方案手动添加ComponentScan注解指定要扫描的包 仅做了解不推荐 推荐做法如下图 将我们定义的controllerservicedao这些包呢都放在引导类所在包com.itheima的子包下这样我们定义的bean就会被自动的扫描到 3.3.3 DI详解
上一小节我们讲解了控制反转IOC的细节接下来呢我们学习依赖注解DI的细节。
依赖注入是指IOC容器要为应用程序去提供运行时所依赖的资源而资源指的就是对象。
在入门程序案例中我们使用了Autowired这个注解完成了依赖注入的操作而这个Autowired翻译过来叫自动装配。
Autowired注解默认是按照类型进行自动装配的去IOC容器中找某个类型的对象然后完成注入操作 入门程序举例在EmpController运行的时候就要到IOC容器当中去查找EmpService这个类型的对象而我们的IOC容器中刚好有一个EmpService这个类型的对象所以就找到了这个类型的对象完成注入操作。 那如果在IOC容器中存在多个相同类型的bean对象会出现什么情况呢 程序运行会报错 如何解决上述问题呢Spring提供了以下几种解决方案 Primary Qualifier Resource 使用Primary注解当存在多个相同类型的Bean注入时加上Primary注解来确定默认的实现。 使用Qualifier注解指定当前要注入的bean对象。 在Qualifier的value属性中指定注入的bean的名称。 Qualifier注解不能单独使用必须配合Autowired使用 使用Resource注解是按照bean的名称进行注入。通过name属性指定要注入的bean的名称。 面试题 Autowird 与 Resource的区别 Autowired 是spring框架提供的注解而Resource是JDK提供的注解 Autowired 默认是按照类型注入而Resource是按照名称注入