5、Spring_DI注解开发

DI 注解开发

1.目前面临问题

  • 建立 mapper

    public interface EmployeeMapper {void save();
    }
    
  • 建立 mapper 实现类

    @Repository
    public class EmployeeMapperImpl implements EmployeeMapper {public void save(){System.out.println("保存员工信息");}
    }
    
  • 建立 service

    public interface IEmployeeService {void save();
    }
    
  • 建立 service 实现类

    @Service
    public class EmployeeServiceImpl implements IEmployeeService {private EmployeeMapper employeeMapper;public void setEmployeeMapper(EmployeeMapper employeeMapper){this.employeeMapper = employeeMapper;}public void save() {employeeMapper.save();}
    }
    
  • 设置配置类

    @Configuration
    @ComponentScan("cn.sycoder.di.di01")
    public class DiConfig {
    }
    
  • 出现空指针异常

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oSHnV3L7-1692700773739)(picture/image-20221028160214170.png)]

2.使用类型注入

  • @Autowired按照类型注入

  • 通过构造器注入

    @Autowired
    public EmployeeServiceImpl(EmployeeMapper employeeMapper) {this.employeeMapper = employeeMapper;
    }
    
  • 通过setter 方法注入

    @Autowired
    public void setEmployeeMapper(EmployeeMapper employeeMapper) {this.employeeMapper = employeeMapper;
    }
    
  • 直接在属性上使用(是以后用得最多的)

    @Service
    public class EmployeeServiceImpl implements IEmployeeService {@Autowiredprivate EmployeeMapper employeeMapper;public void save() {employeeMapper.save();}
    }
    
    • 注意:不提供setter 方法以及构造器是使用反射创建对象的

      @Testpublic void autowired() throws Exception {final Class<?> aClass = Class.forName("cn.sycoder.di.di01.service.impl.EmployeeServiceImpl");final Object o = aClass.newInstance();final Field[] fields = aClass.getDeclaredFields();AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(DiConfig.class);final EmployeeMapper bean = context.getBean(EmployeeMapper.class);for (Field field : fields) {field.setAccessible(true);field.set(o,bean);}final EmployeeServiceImpl service = (EmployeeServiceImpl) o;service.save();}
      
    • 根据类型注入必须只有一个实现类,否则会报错,添加名称也不行

      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZJHcdvtU-1692700773741)(picture/image-20221028161616168.png)]

  • 属性required=false,如果找不到不会报错

3.使用名称注入

  • @Autowired & @Qualifier

  • @Autowired & @Qualifier必须同时使用,缺一不可

  • 解决刚才出现两个实现类没法注入的问题

  • 配置mapper 并且指定实现类的名称

    public interface EmployeeMapper {void save();
    }@Repository("empMapper2")
    public class EmployeeMapperImpl implements EmployeeMapper {public void save(){System.out.println("保存员工信息");}
    }@Repository("empMapper1")
    public class EmployeeMapperImpl1 implements EmployeeMapper{public void save() {System.out.println("save");}
    }
    
  • 注入的时候使用名称注入

    @Service
    public class EmployeeServiceImpl implements IEmployeeService {@Autowired(required = false)@Qualifier("empMapper1")private EmployeeMapper employeeMapper;public void save() {employeeMapper.save();}}
    

4.简单数据类型注入

  • @Value

    @Component
    public class DbProperties {@Value("sy")private String username;@Value("123456")private String password;}
    
  • 硬编码,太垃圾了,需要改成动态

5.注解读取配置文件参数

  • @Value

  • 修改配置类

    @Configuration
    @ComponentScan("cn.sycoder.di.di01")
    @PropertySource("db.properties")
    public class DiConfig {
    }
    
  • 修改获取方式使用 ${} 的方式

    @Component
    public class DbProperties {@Value("${username}")private String username;@Value("${password}")private String password;public void test(){System.out.println(username + ":" + password);}
    }
    

5.1@PropertySource

  • @PropertySource 加载配置文件

  • 位置:配置类上

  • 作用导入配置文件

  • 对于多个配置文件

    @Configuration
    @ComponentScan("cn.sycoder.di.di01")
    @PropertySource({"db.properties","xx.properties"})
    public class DiConfig {
    }
    

6.注解配置第三方bean

6.1配置 druid

  • 添加依赖

    <dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.2.8</version>
    </dependency>
    
  • 先添加配置类 SpringConfig

    @Configuration
    public class SpringConfig {public DataSource dataSource(){final DruidDataSource source = new DruidDataSource();source.setUsername("root");source.setPassword("123456");source.setDriverClassName("com.mysql.cj.jdbc.Driver");source.setUrl("jdbc:mysql://localhost:3306/mybatis");return source;}}
    
  • 传统做法存在硬编码,DataSource 并且没有交给 spring 管理,每次都需要重新新建 DataSource ,并不存在单例一说

    @Testpublic void testDruid(){AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(SpringConfig.class);final SpringConfig bean = context.getBean(SpringConfig.class);System.out.println(bean.dataSource());}
    

6.2@Bean 配置 druid

  • 使用@Bean 交给 spring 管理

    @Configuration
    public class SpringConfig {@Beanpublic DataSource dataSource(){final DruidDataSource source = new DruidDataSource();source.setUsername("root");source.setPassword("123456");source.setDriverClassName("com.mysql.cj.jdbc.Driver");source.setUrl("jdbc:mysql://localhost:3306/mybatis");return source;}}
    
  • 修改配置的硬编码改成软编码

    @Configuration
    @PropertySource("druidDb.properties")
    public class SpringConfig {@Value("${jdbc.username}")private String username;@Value("${jdbc.password}")private String password;@Value("${jdbc.url}")private String url;@Value("${jdbc.driverClassName}")private String driver;@Beanpublic DataSource dataSource(){final DruidDataSource source = new DruidDataSource();source.setUsername(username);source.setPassword(password);source.setDriverClassName(driver);source.setUrl(url);return source;}}
    
    jdbc.username=root
    jdbc.password=123456
    jdbc.driverClassName=com.mysql.cj.jdbc.Driver
    jdbc.url=jdbc:mysql://localhost:3306/mybatis
    
  • @Bean 与 xml 对应

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Xn4DyXfT-1692697345778)(picture/image-20221029105022768.png)]

7.使用@Import 实现配置导入

  • 目前存在:任何类都配置到配置类里面,不方便管理,也不方便维护

7.1配置 Component 解决

  • @Component

    @Component
    public class DruidConfig {@Value("{jdbc.username}")private String username;@Value("{jdbc.password}")private String password;@Value("{jdbc.url}")private String url;@Value("{jdbc.driverClassName}")private String driver;@Beanpublic DataSource dataSource(){final DruidDataSource source = new DruidDataSource();source.setUsername(username);source.setPassword(password);source.setDriverClassName(driver);source.setUrl(url);return source;}
    }
    

7.2使用@import

  • 修改druidConfig

    @Configuration
    public class DruidConfig {@Value("{jdbc.username}")private String username;@Value("{jdbc.password}")private String password;@Value("{jdbc.url}")private String url;@Value("{jdbc.driverClassName}")private String driver;@Beanpublic DataSource dataSource(){final DruidDataSource source = new DruidDataSource();source.setUsername(username);source.setPassword(password);source.setDriverClassName(driver);source.setUrl(url);return source;}
    }
    
  • 修改spring配置类

    @Configuration
    @PropertySource("druidDb.properties")
    @Import({DruidConfig.class})
    public class SpringConfig {
    }
    
  • 如果需要传参,只需要将参数交给spring管理就行了

    @Configuration
    public class RepositoryConfig {@Beanpublic AccountRepository accountRepository(DataSource dataSource) {return new JdbcAccountRepository(dataSource);}
    }
    

8.注解开发总结

注解配置xml 配置功能说明
@Component
@Controller
@Service
@Repository
bean 标签(id,class)定义bean
@ComponentScan<context:component-scan base-package=“cn.sycoder.ioc.xmlAnnotationBean”/>扫描包加载bean
@Autowired
@Qualifier
@Value
setter 注入
构造器注入
自动装配
依赖注入
@Beanbean 标签,静态工厂模式,实例工厂模式,FactoryBean配置第三方bean
@Scopebean 标签中的 scope 属性设置作用域
@PostConstructor
@PreDestroy
bean 标签中的 init-method / destroy-method生命周期相关
@Import导入其它的配置类
@PropertySource({“db.properties”,“xx.properties”})<context:property-placeholder system-properties-mode=“NEVER” location=“*.properties”/>导入配置文件

9.lombok 地址

  • lombok学习地址

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/81335.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

人机对抗智能-部分可观测异步智能体协同(POAC)

环境链接&#xff1a;数据中心-人机对抗智能 (ia.ac.cn)http://turingai.ia.ac.cn/data_center/show/10 1.环境配置 Ubuntu 20.04 Anaconda python版本3.6 1.1 安装torch0.4.1失败 参考文章&#xff1a; 安装torch0.4.1的神坑_torch0.4.1_DEMO_Tian的博客-CSDN博客 co…

CTFshow——web入门——反序列化web254-web278 详细Writeup

前言 在做题之前先简要总结一下知识点 private变量会被序列化为&#xff1a;\x00类名\x00变量名 protected变量会被序列化为: \x00\*\x00变量名 public变量会被序列化为&#xff1a;变量名__sleep() &#xff1a;//在对象被序列化之前运行__wakeup() //将在反序列化之后立即…

日志搞不定?手把手教你如何使用Log4j2

系列文章目录 从零开始&#xff0c;手把手教你搭建Spring Boot后台工程并说明 Spring框架与SpringBoot的关联与区别 SpringBean生成流程详解 —— 由浅入深(附超精细流程图) Spring监听器用法与原理详解 Spring事务畅谈 —— 由浅入深彻底弄懂 Transactional注解 面试热点详解…

Java实现一个简单的图书管理系统(内有源码)

简介 哈喽哈喽大家好啊&#xff0c;之前作者也是讲了Java不少的知识点了&#xff0c;为了巩固之前的知识点再为了让我们深入Java面向对象这一基本特性&#xff0c;就让我们完成一个图书管理系统的小项目吧。 项目简介&#xff1a;通过管理员和普通用户的两种操作界面&#xff0…

SQL注入之延时注入

文章目录 延时注入是什么&#xff1f;延时注入获取数据库版本号 延时注入是什么&#xff1f; 延时注入就是利用sleep()函数通过if语句判断所写的语句真假&#xff0c;如果为真返回我们想要的东西&#xff08;例如&#xff1a;数据库的长度&#xff0c;数据库的名字等&#xff0…

视频汇聚/视频云存储/视频监控管理平台EasyCVR提升网络稳定小tips来啦!

安防视频监控/视频集中存储/云存储/磁盘阵列EasyCVR平台可拓展性强、视频能力灵活、部署轻快&#xff0c;可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等&#xff0c;以及支持厂家私有协议与SDK接入&#xff0c;包括海康Ehome、海大宇等设备的SDK等。平台既具备传统安…

【脚踢数据结构】图(纯享版)

(꒪ꇴ꒪ )&#xff0c;Hello我是祐言QAQ我的博客主页&#xff1a;C/C语言&#xff0c;Linux基础&#xff0c;ARM开发板&#xff0c;软件配置等领域博主&#x1f30d;快上&#x1f698;&#xff0c;一起学习&#xff0c;让我们成为一个强大的攻城狮&#xff01;送给自己和读者的…

Git:本地仓库创建和远程绑定

创建远程仓库 登录git网站&#xff0c;创建一个远程仓库 创建时可以选择仓库属性&#xff0c;公共/私有。仓库命名之类。创建完毕后可以在网站上看到仓库所在网址。 创建本地仓库 打开一个文件夹&#xff0c;鼠标右键Git Bash Here&#xff0c;打开git的命令行 git init//…

【C++11】future和async等

C11的future和async等关键字 1.async和future的概念 std::async 和 std::future 是 C11 引入的标准库功能&#xff0c;用于实现异步编程&#xff0c;使得在多线程环境中更容易处理并行任务。它们可以帮助你在不同线程中执行函数&#xff0c;并且能够方便地获取函数的结果。 在…

基于微信小程序的垃圾分类系统设计与实现(2.0 版本,附前后端代码)

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝30W、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 1 简介 视频演示地址&#xff1a; 基于微信小程序的智能垃圾分类回收系统&#xff0c;可作为毕业设计 小…

win11 设置小任务栏

设置后效果 以下两种工具均可 1、StartAllBack 2、Start11

Unity3d:GameFramework解析:实体,对象池,资源管理,获取计数,引用计数,自动释放

基本概念 1.GF万物基于引用池IReference 2.ObjectBase : IReference类的m_Target持有unity中Mono&#xff0c;资源&#xff0c;GameObejct 3.AssetObject : ObjectBase类m_Target持有Assetbundle中的Asset&#xff0c;具有获取&#xff0c;引用两个计数管理释放 4.ResourceObj…