关于我们

质量为本、客户为根、勇于拼搏、务实创新

< 返回新闻公共列表

云南大王-基于注解的IOC配置

发布时间:2020-04-13 00:00:00
基于注解的IOC配置 这种配置,我们需要建立一个容器(我这里创建容器的范围大点) 用于创建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)   业务层实现类 //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的作用是一样的,用于指定要扫描的包,使用此注解等就等同上述的 导入配置类时,可以在@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);    

相关阅读

centos7系统中忘记了root管理员账号密码的解决方式公司管理必须的20条军规[参考]云南昆明天猫旗舰店如何开_怎么开_要什么条件云南大王-通俗理解spring源码(三)—— 获取xml的验证模式 云南大王-用户登录 云南大王-【Golang进阶】指针的详细讲解 云南大王-Java 单线程代码ThreadLocal串值问题 云南大王-Java 实例级别的锁和类级别的锁 云南大王-工作流引擎会签,加签,主持人,组长模式专题讲解 云南大王-Android连载5云南大王-NTP对时器(NTP对时服务器)重要性!京准电子科技 云南大王-关于redis单线程的分析 云南大王-CVE云南大王-PHP SESSION反序列化本地样例分析 云南大王-这不就是多线程ThreadPoolExecutor和阻塞队列吗 云南大王-Tomcat AJP 文件包含漏洞(CVE云南大王-讲真,这两款idea插件,能治愈你英语不好的病 云南大王-消息中间件ActiveMQ、RabbitMQ、RocketMQ、ZeroMQ、Kafka如何选型? 云南大王-JVM系列十三(类加载器). 云南大王-Win10安装MySQL8压缩包版 云南大王-初始WebApi(2) 云南大王-初识人工智能(二):机器学习(一):sklearn特征抽取 云南大王-Popup中ListBox的SelectChange事件关闭弹出窗体后主窗体点击无效BUG 云南大王-基础知识记录 云南大王-FastDFS搭建图片服务器 云南大王-git/sourcetree解决本地仓库历史合并到线上仓的历史数据合并问题_refusing to merge unrelated histories 云南大王-js判断字符是否在数组中【转】 云南大王-Python 云南大王-面向对象之多线程(可捎带电梯调度) 云南大王-Python练习题2.5求奇数分之一序列前N项和(存在问题) 云南大王-React 中的前端路由 react云南大王-VSCODE 远程开发树莓派 云南大王-React新闻网站云南大王-vs .net CS0006 C# 未能找到元数据文件 .dll 云南大王-Vue.js 技术揭秘 云南大王-流程控制语句云南大王-Python学习笔记:Python的时间操作(time,datetime,timedelta,calendar) 云南大王-流程控制语句云南大王-golang Gin framework with websocket 云南大王-多重判断if..else嵌套语句 云南大王-用户登录 云南大王-流程控制语句云南大王-密码类 云南大王-Unity2018发布WebGL注意事项总结 云南大王-web系统安全运营之基础云南大王- 流程控制语句云南大王-中型WPF客户端开发项目总结(3.3.4) 云南大王-流程控制语句云南大王-流程控制语句云南大王-流程控制语句云南大王-中型WPF客户端开发项目总结(4) 云南大王-流程控制语句云南大王-ASP.NET Core笔记(4) 云南大王-C# 基础知识系列云南大王-让 .NET 轻松构建中间件模式代码(二) 云南大王-基于 HTML5 WebGL 的 水泥工厂可视化系统 云南大王-.NET Core 3 WPF MVVM框架 Prism系列之导航系统 云南大王-《JavaScript异步编程》精读笔记 云南大王-合理使用CSS框架,加速UI设计进程 云南大王-CLSID 为 {000209FF云南大王-从零基础转行到前端大牛,需要经过哪几个阶段? 云南大王-一个简单的例子看明白 async await Task 云南大王-【目前】宇宙第一IDE Visual Studio 合并压缩css、js扩展组件云南大王-写一个通用的List集合导出excel的通用方法 云南大王-Bootstrap4 按钮组+徽章(Badges)+进度条+分页+列表组 云南大王-Web前端工程师需要学些什么? 云南大王-react嵌套路由 云南大王-【java框架】Struts2(2) 云南大王-javaSE笔记云南大王-.net core 集成 sentry 进行异常报警 云南大王-Java の 四种引用 云南大王-JVM 虚拟机&&类加载(一) 云南大王-使用Fastjson实现JSON与JavaBean之间互相转换 云南大王-Python操作Oracle数据库:cx_Oracle 云南大王-为什么要用内插字符串代替string.format 云南大王-作为字节跳动的面试官,有些话我不得不说! 云南大王-微信公众号自定义菜单与启用服务器配置冲突(图文消息、链接及文本回复) 云南大王-C#队列学习笔记:RabbitMQ延迟队列 云南大王-Disruptor 基础篇 云南大王-C#获取设备(Audio和Video)名称 简单整理 云南大王-基于注解的IOC配置 云南大王-C#调用EnumDevice获取设备信息 云南大王-Jenkins基础系统之更换镜像源 云南大王-Jenkins基础系统之完整的.net项目编译 云南大王-Scala学习系列(二)——环境安装配置 云南大王-WinForm中DataGridView复制选中单元格内容解决方案 云南大王-关键词匹配优化(第0篇)—— 问题和思路 云南大王-ASP.NET CORE WEBAPI文件下载 云南大王-GC垃圾回收器 云南大王-多线程之旅(Task 任务) 云南大王-当模板方法遇到了委托函数,你的代码又可以精简了 云南大王-基于.NetCore3.1搭建项目系列 —— 使用Swagger导出文档 (补充篇) 云南大王-关键词匹配优化(第1篇)—— 测试计算过程 云南大王-原理解密 → Spring AOP 实现动态数据源(读写分离),底层原理是什么 云南大王-Navicat 密码加密算法 云南大王-【WPF学习】第六十六章 支持可视化状态 云南大王-composer安装 windows 云南大王-ASP.NET Core中的Controller 云南大王-HttpClient来自官方的JSON扩展方法 云南大王-Python3标准库:http.cookies HTTP cookie
/template/Home/Zkeys/PC/Static