• Spring使用(二)


    1. 注解开发定义bean

    1.1 @Component

    使用@Component注解替代xml中的

    BookDaoImpl

    1. @Component("bookDao")
    2. public class BookDaoImpl implements BookDao {
    3. public void save() {
    4. System.out.println("book dao save ..." );
    5. }
    6. }
    XML 与注解配置的对应关系:
    @Component对应,@Component的value对应的id属性,@Component修饰的类对应的class属性

    1.2 配置spring扫描的注解包

    去掉xml的bean后,spring需要知道哪些package下有bean,所以需要在xml中添加以下配置:

    <context:component-scan base-package="com.lan"/>

    2. 纯注解开发模式

    下面讲解不需要任何xml配置的纯注解开发模式

    2.1 创建配置类

    SpringConfig

    1. package com.lan.config;
    2. import org.springframework.context.annotation.ComponentScan;
    3. import org.springframework.context.annotation.Configuration;
    4. //声明当前类为Spring配置类
    5. @Configuration
    6. //设置bean扫描路径,多个路径书写为字符串数组格式
    7. @ComponentScan({"com.lan.service","com.lan.dao"})
    8. public class SpringConfig {
    9. }

    2.2 初始化IOC容器

    1. // 根据SpringConfig去初始化IOC容器
    2. ApplicationContext ctx = new AnnotationConfigApplicationContext(SpringConfig.class);
    3. BookDao bookDao = (BookDao) ctx.getBean("bookDao");

    2.3 注解开发bean的作用范围和生命周期管理

    2.3.1 @Scope

    该注解相当于的scope属性

    1. @Scope("singleton") // 默认值是singleton,可选prototype
    2. @Component("bookDao")
    3. public class BookDaoImpl implements BookDao {
    4. public void save() {
    5. System.out.println("book dao save ..." );
    6. }
    7. }

    2.3.2 @PostConstruct和@PreDestroy

    分别对应的init-method和destroy-method属性

    2.4 注解方式实现依赖注入

    2.4.1 @Autowired

    该注解根据类型自动注入bean,可以用于成员变量、构造方法、setter方法

    1. @Autowired // 根据类型自动注入,注入BookDao类型的bean
    2. private BookDao bookDao;

    2.4.2 @Qualified

    该注解根据bean的id自动注入bean,但不能单独使用,需要和@Autowired一起配合使用

    1. @Autowired // 根据类型自动注入,注入BookDao类型的bean
    2. @Qualified("bookDao") // 配合@Autowired一起使用,根据bean id自动注入bean
    3. private BookDao bookDao;

    2.4.3 @PropertySource + @Value 读取properties文件

    配置类上使用@PropertySource加载properties文件

    1. package com.lan.config;
    2. import org.springframework.context.annotation.ComponentScan;
    3. import org.springframework.context.annotation.Configuration;
    4. //声明当前类为Spring配置类
    5. @Configuration
    6. //设置bean扫描路径,多个路径书写为字符串数组格式
    7. @ComponentScan({"com.lan.service","com.lan.dao"})
    8. @PropertySource({"jdbc.properties", "xxx.properties"}) // 指定要加载的properties文件
    9. public class SpringConfig {
    10. }

    在bean里使用@Value注入对应的变量

    1. @Value("${spring.datasource.username}") // 注入变量
    2. private String username;
    3. @Value("100") // 注入常量
    4. private int scope;

    2.5 注解方式管理第三方bean

    2.5.1 @Bean

    直接使用@Bean注解创建并管理第三方bean

    1. @Configuration
    2. public class SpringConfig {
    3. @Bean
    4. public DataSource dataSource(){
    5. DruidDataSource ds = new DruidDataSource();
    6. ds.setDriverClassName("com.mysql.jdbc.Driver");
    7. ds.setUrl("jdbc:mysql://localhost:3306/spring_db");
    8. ds.setUsername("root"); ds.setPassword("root");
    9. return ds;
    10. }
    11. @Bean
    12. public DataSourceWrapper dataSourceWrapper(DataSource datasource) { // 依赖其它bean
    13. return new DataSourceWraper(datasource);
    14. }
    15. }

    2.5.2 @Import

    通过Import导入配置类,导入的类也会成为bean

    SpringConfig

    1. @Configuration
    2. @Import(JdbcConfig.class) // 导入该类,该类可以位于其它package下
    3. public class SpringConfig {
    4. }

    JdbcConfig

    1. public class JdbcConfig { // 该类不用加注解
    2. @Value("${datasource.username}")
    3. private String username;
    4. @Value("${datasource.password}")
    5. private String password;
    6. @Value("${datasource.driverClassName}")
    7. private String driverClassName;
    8. @Value("${datasource.jdbcUrl}")
    9. private String jdbcUrl;
    10. @Bean
    11. public DataSource dataSource(){
    12. DruidDataSource ds = new DruidDataSource();
    13. ds.setDriverClassName(driverClassName);
    14. ds.setUrl(jdbcUrl);
    15. ds.setUsername(username);
    16. ds.setPassword(password);
    17. return ds;
    18. }
    19. }

    3. Spring整合Junit

    maven依赖

    1. <dependency>
    2. <groupId>junitgroupId>
    3. <artifactId>junitartifactId>
    4. <version>4.12version>
    5. <scope>testscope>
    6. dependency>
    7. <dependency>
    8. <groupId>org.springframeworkgroupId>
    9. <artifactId>spring-testartifactId>
    10. <version>5.2.10.RELEASEversion>
    11. dependency>

    测试类

    1. package com.itheima.service;
    2. import com.itheima.config.SpringConfig;
    3. import org.junit.Test;
    4. import org.junit.runner.RunWith;
    5. import org.springframework.beans.factory.annotation.Autowired;
    6. import org.springframework.test.context.ContextConfiguration;
    7. import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
    8. //设置类运行器
    9. @RunWith(SpringJUnit4ClassRunner.class)
    10. //设置Spring环境对应的配置类
    11. @ContextConfiguration(classes = SpringConfig.class)
    12. public class AccountServiceTest {
    13. //支持自动装配注入bean
    14. @Autowired
    15. private AccountService accountService;
    16. @Test
    17. public void testFindById(){
    18. System.out.println(accountService.findById(1));
    19. }
    20. @Test
    21. public void testFindAll(){
    22. System.out.println(accountService.findAll());
    23. }
    24. }

    4. Spring整合Mybatis

    新增maven依赖,用于自动生成Mybatis相关的bean

    1. <dependency>
    2. <groupId>org.mybatisgroupId>
    3. <artifactId>mybatis-springartifactId>
    4. <version>1.3.0version>
    5. dependency>

    SpringConfig

    1. @Configuration
    2. @Import(MybatisConfig.class)
    3. public class SpringConfig {
    4. }

    MybatisConfig

    1. package com.lan.config;
    2. import org.mybatis.spring.SqlSessionFactoryBean;
    3. import org.mybatis.spring.mapper.MapperScannerConfigurer;
    4. import org.springframework.context.annotation.Bean;
    5. import javax.sql.DataSource;
    6. public class MybatisConfig {
    7. //定义bean,SqlSessionFactoryBean,用于产生SqlSessionFactory对象
    8. @Bean
    9. public SqlSessionFactoryBean sqlSessionFactory(DataSource dataSource){
    10. SqlSessionFactoryBean ssfb = new SqlSessionFactoryBean();
    11. ssfb.setTypeAliasesPackage("com.itheima.domain");
    12. ssfb.setDataSource(dataSource);
    13. return ssfb;
    14. }
    15. //定义bean,返回MapperScannerConfigurer对象
    16. @Bean
    17. public MapperScannerConfigurer mapperScannerConfigurer(){
    18. MapperScannerConfigurer msc = new MapperScannerConfigurer();
    19. msc.setBasePackage("com.itheima.dao");
    20. return msc;
    21. }
    22. }

    使用Mybatis操作接口

    1. ApplicationContext ctx = new AnnotationConfigApplicationContext(SpringConfig.class);
    2. AccountService accountService = ctx.getBean(AccountService.class);
    3. Account ac = accountService.findById(1);
  • 相关阅读:
    微信“刷掌支付”上线!出门带手就可以了~
    OCX 添加方法和事件 HTML调用ocx函数及回调 ocx又调用dll VS2017
    OpenGL ES之深入解析RGB图像与YUV格式之间的相互转换
    7.5 - 防火墙 7.6 - 安全协议
    林业草原防火智能可视化平台
    公司分支使用5G链路和总部建立IPS加密隧道配置案例
    如何用ChatGPT+GEE+ENVI+Python进行高光谱,多光谱成像遥感数据处理?
    Spring 远程命令执行漏洞分析(CVE-2022-22965)
    webpack、vue.config.js
    「 程序员的风险控制」两三百实现医疗自由,不怕学习工作太拼生病花大钱
  • 原文地址:https://blog.csdn.net/werewolf2017/article/details/126135819