基于注解的IOC配置
基于注解的IOC配置
-
这种配置,我们需要建立一个容器(我这里创建容器的范围大点)
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <!-- 读取配置文件时,告知spring在创建容器时要扫描的包,配置所需要的标签不是在beans的约束中,而是一个 名称为context名称空间的约束中 --> <context:component-scan base-package="com.mypro"></context:component-scan> </beans>
-
用于创建bean对象的注解
-
简述:相当于在xml配置中编写一个bean标签的功能
-
@Component
-
作用:把当前类对象存入spring容器中
-
属性:value:用于指定bean的id;默认是首写字母小写的类名称
-
-
@Controller: 一般用在表现层
-
@Service: 一般用在业务层
-
@Repository: 一般用在持久层
-
以上三种注解和第一种注解的作用和属性是一样的
package com.mypro.service.impl; import com.mypro.dao.UserDao; import com.mypro.dao.impl.UserDaoImpl; import com.mypro.service.UserService; import org.springframework.stereotype.Service; @Service(value = "userService") public class UserServiceImpl implements UserService { private UserDao userDao = new UserDaoImpl(); @Override public void saveUser() { userDao.saveUser(); } }
-
-
用于注入数据的注解
-
简述:相当于xml配置文件中bean标签编写一个property标签的功能
-
@Autowired
-
作用:只要容器中有唯一的bean对象类型和要注入的变量类型匹配,就可以自动按照类型注入;如果没有任何的bean的类型和要注入的变量匹配,程序就报错;如果有多个匹配,但是可以根据变量名和注入bean的id匹配,若无匹配则报错
-
作用域:可以是变量名上,可以是方法名上
-
细节:不需要setter方法了
package com.mypro.service.impl; import com.mypro.dao.UserDao; import com.mypro.service.UserService; import org.springframework.stereotype.Service; @Service(value = "userService") public class UserServiceImpl implements UserService { @Autowired private UserDao userDao; @Override public void saveUser() { userDao.saveUser(); } }
-
-
@Qualifier
-
作用:就是解决上述多个匹配结果(原因是至少有两个实现类实现了UserDao接口),可以用此注解来指定要注解的类,不能单独使用,需要和@Autowired一起使用
-
属性:value:指定的注入bean的id
-
假设UserDaoImpl2也实现了UserDao接口,并且将此类对象存入spring容器中
package com.mypro.service.impl; import com.mypro.dao.UserDao; import com.mypro.service.UserService; import org.springframework.stereotype.Service; @Service(value = "userService") public class UserServiceImpl implements UserService { @Autowired @Qualifier(value="userDaoImpl2") private UserDao userDao; @Override public void saveUser() { userDao.saveUser(); } }
-
-
Resource
-
作用:就是简化上述两个注解的使用
-
属性:name:指定的注入bean的id
-
-
@Value
-
作用:用于注入基本数据类型和String类型
-
属性:value:用于指定数据的值,可以使用spring的SpEL表达式(${})
-
-
注意事项:前三种注解只能注解其他bean类型的数据,集合类型的数据注入方式只能通过xml配置文件实现
-
基于注解完成IOC配置(案例)一定参考上一篇的“基于xml文件的IOC配置”
-
主配置文件、实体类、测试类、业务层接口、持久层接口这届个文件都可以不用改
-
事先创建一个大容器(myWordBean.xml)
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <!-- 读取配置文件时,告知spring在创建容器时要扫描的包,配置所需要的标签不是在beans的约束中,而是一个 名称为context名称空间的约束中 --> <context:component-scan base-package="com.mypro"></context:component-scan> <!-- 配置QueryRunner对象 --> <bean id="runner" class="org.apache.commons.dbutils.QueryRunner" scope="prototype"> <!-- 注入数据源 --> <constructor-arg name="ds" ref="dataSource"></constructor-arg> </bean> <!-- 配置数据源 --> <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"> <!-- 连接数据库 --> <property name="driverClass" value="com.mysql.jdbc.Driver"></property> <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/myword"></property> <property name="user" value="root"></property> <property name="password" value="123456"></property> </bean> </beans>
-
业务层实现类
//1、在业务层实现类名上添加一个容器注解@Service(value = "wordsService")
//2、在private WordsDao wordsDao上添加一个注入数据的注解@Autowired
//3、该变量的setter方法可有可无 -
持久层实现类
//1、在业务层实现类名上添加一个容器注解@Repository(value = "wordsDao")
//2、在private QueryRunner runner上添加一个注入数据的注解@Autowired
//3、该变量的setter方法可有可无 -
这种Spring IOC配置并不完全基于注解的方式,以下就需要使用spring的新注解来完全替代xml配置,浏览时建议配置文件和配置类对比浏览
-
首先我们需要创建一个类,并且指定当前类是配置类。使用@Configuration注解指定,如果在读取时的参数已经指定了配置类为参数时,就可以省略不写;扫描的其他包下的配置类或者扫描当前包下的其他配置类都要写注解,否则就不是配置类了
-
读取配置类时,需要读取我们自己创建的类。使用@ComponentScan注解指定扫描的包
-
属性:value和basePackages的作用是一样的,用于指定要扫描的包,使用此注解等就等同上述的
<context:component-scan base-package="com.mypro"></context:component-scan>
-
-
导入配置类时,可以在@ComponentScan下添加@Import(参数),参数就是配置类的字节码文件(类名.class),导入之后,导入的配置类就可以不写@Configuration注解
-
像数据库这种连接数据信息比较隐秘或者统一管理这种数据,我们通常将连接放置在properties文件中,这样在配置类上使用注解@PropertySource("***.properties"),然后就可以在变量使用@Value("${变量名}"),变量名就是properties文件里面的变量名
-
@Bean用于把当前方法的返回值作为bean对象存入spring的IOC容器中
-
属性:name用于指定bean的id,默认是当前方法的名称
-
细节:当我们使用注解配置方法时,如果有参数,spring框架会去容器查找可用的bean对象,查询规则和@Autowired一样
package config; import com.mchange.v2.c3p0.ComboPooledDataSource; import org.apache.commons.dbutils.QueryRunner; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import javax.sql.DataSource; @Configuration @ComponentScan(value = "com.mypro") @PropertySource("jdbcConfig.xml") public class SpringConfiguration { @Value("${jdbc.driver}") private String driver; @Value("${jdbc.url}") private String url; @Value("${jdbc.username}") private String username; @Value("${jdbc.password}") private String password; /** * 用于创建一个QueryRunner对象 * @param dataSource * @return */ @Bean(value = "runner") @Scope("prototype") public QueryRunner createQueryRunner(DataSource dataSource){ return new QueryRunner(dataSource); } /** * 配置连接数据库的资源 * @return */ @Bean(value = "dataSource") public DataSource createDataSource(){ try{ ComboPooledDataSource ds = new ComboPooledDataSource(); ds.setDriverClass(driver); ds.setJdbcUrl(url); ds.setUser(username); ds.setPassword(password); return ds; }catch (Exception e){ throw new RuntimeException(e); } } }
-
-
由于不再是读取xml配置文件,而是读取配置类,读取配置类的类名是AnnotationConfigApplicationContext。只需要在测试类中的去去配置文件改掉即可
ApplicationContext ac = new AnnotationConfigApplicationContext(SpringConfiguration.class);
-
原文地址:https://www.cnblogs.com/aitiknowledge/p/12679155.html
- hust--------The Minimum Length (最短循环节)(kmp)
- hdu-----(3746)Cyclic Nacklace(kmp)
- javaSE之如何将一个文件复制到另一个文件
- 将文件字节输出流写入到文本中
- javaSE之如何将一个文档显示出来(,txt,.doc,.....)
- Git -- 分支与合并 (命令行+可视化工具p4merge)
- java之如何实现调用启动一个可执行文件,exe
- file类之目录
- 理解Go语言Web编程(上)
- 理解Go语言Web编程(下)
- 呆呆的io流输入输出的一些基础
- 机器人 Go 语言库:Gobot
- poj------2406 Power Strings
- 使用Django基础模板搭建自己的知识库
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 在 Kubernetes 中使用 Helm Hooks 迁移数据库
- 漫画:如何螺旋遍历二维数组?
- 轻松学Pytorch-迁移学习实现表面缺陷检查
- 汇总 | OpenCV4中的非典型深度学习模型
- 如何使用私有仓库的 Go Modules
- python绘图 | salem一招解决所有可视化中的掩膜(Mask)问题
- Tungsten Fabric知识库丨关于OpenStack、K8s、CentOS安装问题的补充
- Cypress系列(51)- its() 命令详解
- 推荐 | 深度学习反卷积最易懂理解
- Java实现抢红包算法,附完整代码(公平版和手速版)
- 【代码审计】xyhcms3.5后台任意文件读取
- 前端架构探索与实践
- Centos编译JDK8源码
- R-tmap 绘制带指北针和比例尺的空间地图
- 升级Php Curl扩展遇到的坑