• Spring6 (1) IOC


    目录

    1 环境要求

    2 准备工作

    2.1 引入Spring相关依赖

    2.2 Spring配置文件(.xml)

    3 IOC

    3.1 IOC实现

    3.1.1 ApplicationContext的主要实现类

    3.1.3.1 ClassPathXmlApplicationContext

    3.1.3.2 AnnotationConfigApplicationContext

    3.2 依赖注入DI(Dependency Injection)

    3.3 注解开发

    3.3.1 开启组件扫描

    3.3.2 创建对象注解

    3.3.3 依赖注入的注解

    3.3.4 静态依赖注入

    3.4 全注解开发


    1 环境要求

            (1) IDEA开发工具: 2022.3.3

            (2) JDK: Java17+

            (3) Maven: 3.6+

            (4) Spring: 6+

    2 准备工作

    2.1 引入Spring相关依赖

    1. <dependencies>
    2. <dependency>
    3. <groupId>org.springframeworkgroupId>
    4. <artifactId>spring-contextartifactId>
    5. <version>${spring-version}version>
    6. dependency>
    7. <dependency>
    8. <groupId>org.junit.jupitergroupId>
    9. <artifactId>junit-jupiter-apiartifactId>
    10. <version>5.10.0version>
    11. dependency>
    12. <dependency>
    13. <groupId>org.slf4jgroupId>
    14. <artifactId>slf4j-apiartifactId>
    15. <version>2.0.9version>
    16. dependency>
    17. <dependency>
    18. <groupId>ch.qos.logbackgroupId>
    19. <artifactId>logback-classicartifactId>
    20. <version>1.4.11version>
    21. dependency>
    22. <dependency>
    23. <groupId>org.apache.logging.log4jgroupId>
    24. <artifactId>log4j-coreartifactId>
    25. <version>2.20.0version>
    26. dependency>
    27. <dependency>
    28. <groupId>org.springframeworkgroupId>
    29. <artifactId>spring-aopartifactId>
    30. <version>${spring-version}version>
    31. dependency>
    32. <dependency>
    33. <groupId>org.springframeworkgroupId>
    34. <artifactId>spring-aspectsartifactId>
    35. <version>${spring-version}version>
    36. dependency>
    37. <dependency>
    38. <groupId>com.mysqlgroupId>
    39. <artifactId>mysql-connector-jartifactId>
    40. <version>8.1.0version>
    41. dependency>
    42. <dependency>
    43. <groupId>org.mybatisgroupId>
    44. <artifactId>mybatisartifactId>
    45. <version>3.5.13version>
    46. dependency>
    47. <dependency>
    48. <groupId>org.mybatisgroupId>
    49. <artifactId>mybatis-springartifactId>
    50. <version>3.0.2version>
    51. dependency>
    52. <dependency>
    53. <groupId>com.alibabagroupId>
    54. <artifactId>druidartifactId>
    55. <version>1.2.19version>
    56. dependency>
    57. <dependency>
    58. <groupId>com.mchangegroupId>
    59. <artifactId>c3p0artifactId>
    60. <version>0.9.5.5version>
    61. dependency>
    62. <dependency>
    63. <groupId>org.springframeworkgroupId>
    64. <artifactId>spring-jdbcartifactId>
    65. <version>${spring-version}version>
    66. dependency>
    67. <dependency>
    68. <groupId>org.springframeworkgroupId>
    69. <artifactId>spring-txartifactId>
    70. <version>${spring-version}version>
    71. dependency>
    72. <dependency>
    73. <groupId>com.alibaba.fastjson2groupId>
    74. <artifactId>fastjson2artifactId>
    75. <version>2.0.41version>
    76. dependency>
    77. <dependency>
    78. <groupId>com.fasterxml.jackson.coregroupId>
    79. <artifactId>jackson-databindartifactId>
    80. <version>2.15.2version>
    81. dependency>
    82. <dependency>
    83. <groupId>jakarta.servletgroupId>
    84. <artifactId>jakarta.servlet-apiartifactId>
    85. <version>6.0.0version>
    86. <scope>providedscope>
    87. dependency>
    88. <dependency>
    89. <groupId>org.apache.tomcatgroupId>
    90. <artifactId>tomcat-apiartifactId>
    91. <version>10.1.13version>
    92. dependency>
    93. <dependency>
    94. <groupId>org.springframeworkgroupId>
    95. <artifactId>spring-webmvcartifactId>
    96. <version>${spring-version}version>
    97. dependency>
    98. <dependency>
    99. <groupId>commons-langgroupId>
    100. <artifactId>commons-langartifactId>
    101. <version>2.6version>
    102. dependency>
    103. <dependency>
    104. <groupId>com.github.qcloudsmsgroupId>
    105. <artifactId>qcloudsmsartifactId>
    106. <version>1.0.6version>
    107. dependency>
    108. <dependency>
    109. <groupId>org.apache.poigroupId>
    110. <artifactId>poiartifactId>
    111. <version>5.2.3version>
    112. dependency>
    113. <dependency>
    114. <groupId>org.apache.poigroupId>
    115. <artifactId>poi-ooxmlartifactId>
    116. <version>5.2.3version>
    117. dependency>
    118. <dependency>
    119. <groupId>redis.clientsgroupId>
    120. <artifactId>jedisartifactId>
    121. <version>3.5.2version>
    122. dependency>
    123. <dependency>
    124. <groupId>org.apache.commonsgroupId>
    125. <artifactId>commons-pool2artifactId>
    126. <version>2.10.0version>
    127. dependency>
    128. dependencies>

    2.2 Spring配置文件(.xml)

    1. "1.0" encoding="UTF-8"?>
    2. <beans xmlns="http://www.springframework.org/schema/beans"
    3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    4. xmlns:context="http://www.springframework.org/schema/context"
    5. xmlns:aop="http://www.springframework.org/schema/aop"
    6. xmlns:tx="http://www.springframework.org/schema/tx"
    7. xmlns:p="http://www.springframework.org/schema/p"
    8. xmlns:mvc="http://www.springframework.org/schema/mvc"
    9. xsi:schemaLocation="http://www.springframework.org/schema/beans
    10. http://www.springframework.org/schema/beans/spring-beans.xsd
    11. http://www.springframework.org/schema/context
    12. http://www.springframework.org/schema/context/spring-context.xsd
    13. http://www.springframework.org/schema/aop
    14. http://www.springframework.org/schema/aop/spring-aop.xsd
    15. http://www.springframework.org/schema/tx
    16. http://www.springframework.org/schema/tx/spring-tx.xsd
    17. http://www.springframework.org/schema/mvc
    18. http://www.springframework.org/schema/mvc/spring-mvc.xsd">
    19. <context:property-placeholder location="classpath:config.properties" file-encoding="utf-8"/>
    20. <context:component-scan base-package="xyz.aboluo" use-default-filters="false">
    21. <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
    22. <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
    23. context:component-scan>
    24. <aop:aspectj-autoproxy/>
    25. <bean id="user" class="xyz.aboluo.User">
    26. <property name="name" value="${aaa}">property>
    27. <property name="age" ref="${bbb}">property>
    28. <constructor-arg name="hobby" value="${ccc}"/>
    29. bean>
    30. <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    31. <property name="driverClassName" value="${mysql.driver}"/>
    32. <property name="url" value="${mysql.url}"/>
    33. <property name="username" value="${mysql.username}"/>
    34. <property name="password" value="${mysql.password}"/>
    35. bean>
    36. <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
    37. <property name="driverClassName" value="${mysql.driver}"/>
    38. <property name="url" value="${mysql.url}"/>
    39. <property name="username" value="${mysql.username}"/>
    40. <property name="password" value="${mysql.password}"/>
    41. bean>
    42. <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
    43. <property name="driverClass" value="${mysql.driver}"/>
    44. <property name="jdbcUrl" value="${mysql.url}"/>
    45. <property name="user" value="${mysql.username}"/>
    46. <property name="password" value="${mysql.password}"/>
    47. bean>
    48. <bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    49. <property name="dataSource" ref="dataSource"/>
    50. bean>
    51. <tx:annotation-driven transaction-manager="txManager"/>
    52. <import resources="spring.xml"/>
    53. beans>

    3 IOC

            底层核心原理JAVA反射

            IOC(Inversion Of Control)控制反转(创建对象不再时通过new,而是交给IOC容器)

            Spring通过IOC容器来管理所有JAVA对象的实例化和初始化控制对象与对象之间的依赖关系,这些由IOC容器管理的JAVA对象称为Spring Bean(它与由关键字new创建的JAVA对象没有任何区别)

    3.1 IOC实现

    3.1.1 ApplicationContext的主要实现类

            BeanFactory是IOC容器的基本实现,是Spring内部使用的接口,不向开发人员提供

            ApplicationContext是BeanFactory的子接口,提供了更多高级特性,面向开发者(几乎所有场合都可以使用ApplicationContext,而不是更底层的BeanFactory)

    实现类简介
    ClassPathXmlApplicationContext通过读取类路径下的xml配置文件创建IOC容器对象
    AnnotationConfigApplicationContext通过读取配置类创建IOC容器对象
    3.1.3.1 ClassPathXmlApplicationContext
    1. @Test
    2. public void userTest() {
    3. // 加载spring配置文件,创建"容器对象"
    4. ApplicationContext context = new ClassPathXmlApplicationContext("bean.xml");
    5. // 从容器中获取对应的对象
    6. User user = context.getBean("user", User.class);
    7. // 使用对象
    8. user.aaa();
    9. }
    3.1.3.2 AnnotationConfigApplicationContext
    1. @Test
    2. public void userTest() {
    3. // 加载spring配置类,创建"容器对象"
    4. ApplicationContext context = new AnnotationConfigApplicationContext(SpringConfig.class);
    5. // 从容器中获取对应的对象
    6. User user = context.getBean("user", User.class);
    7. // 使用对象
    8. user.aaa();
    9. }

    3.2 依赖注入DI(Dependency Injection)

            在Spring创建对象过程中,注入对象依赖的属性:

                    (1) set注入: 有空参构造方法,和对应的set方法

                    (2) 构造注入: 有对应的构造方法

                    (3) 注解注入: 有空参构造方法

    3.3 注解开发

    3.3.1 开启组件扫描

    3.3.2 创建对象注解

            被注解的类必须有空参构造方法

            这些注解不能写在接口上,要写在类上

    注解说明
    @Component默认使用类名(首字母小写)
    @Controller通常用于控制层,功能与@Component相同
    @Service通常用于业务层,功能与@Component相同
    @Repository通常用于数据访问层,功能与@Component相同

    3.3.3 依赖注入的注解

    注解说明
    @Autowired

    根据类型去IOC容器匹配类/类的子类/接口实现类

    可以用在方法

    @Qualifier("名称")

    要配合@Autowired使用

    根据类型名称去IOC容器进行匹配

    @Value("值")("${key}")

    基本数据类型和String类型

    不能用作静态变量(static),不能用作常量(final)

    3.3.4 静态依赖注入

            @Autowired不能作用在静态成员上,但可以在类中先声明静态成员变量,然后用@Autowired作用在非静态set方法上来进行属性注入,间接达到"静态依赖注入"的效果

    1. @Component
    2. public class Common {
    3. /**
    4. * 静态声明
    5. */
    6. private static StringRedisTemplate stringRedisTemplate;
    7. @Autowired
    8. public void setStringRedisTemplate(StringRedisTemplate stringRedisTemplate) {
    9. Common.stringRedisTemplate = stringRedisTemplate;
    10. }
    11. }

    3.4 全注解开发

            用配置类来替代xml配置文件

    注解

    说明

    @Import

    用在Spring配置类上

    可以引入配置类

    也可以引入Controller,Service,POJO等类,被@Import引入的类可以不写@Component,@Service等注解,依然会被注册进SpringIOC容器

    @Scope("singleton/prototype")

    用于指定bean对象的作用范围(默认singleton)

    可以不配合单独使用,该bean被@Import引入Spring配置类即可生效

    可以配合@Component等注解,也可以配合@Bean注解

    @Bean

    方法的返回值作为Bean交给SpringIOC容器管理

    如果方法需要参数,会从IOC容器获取(默认按类型注入/多个匹配按形参名注入)

    1. @Configuration //配置类注解
    2. @Import({DataSourceConfig.class,TransactionConfig.class}) //将类注册进SpringIOC容器 ; 引入其他配置类
    3. @ComponentScan(value = "xyz.aboluo", excludeFilters = @ComponentScan.Filter(
    4. type = FilterType.ANNOTATION, //按注解类型过滤(不扫描)
    5. classes = {Controller.class, Service.class}
    6. ), includeFilters = @ComponentScan.Filter(
    7. type = FilterType.ANNOTATION, //按注解类型过滤(只扫描)
    8. classes = {Controller.class, Service.class}
    9. )) //开启组件扫描(配置类也要在其中)
    10. @PropertySource(value = "config.properties", encoding = "utf-8") //引入properties文件
    11. @EnableAspectJAutoProxy //开启Spring对”注解AOP”的支持
    12. @EnableTransactionManagement //开启Spring对”注解事务”的支持(需要有对应的"事务管理器"交给SpringIOC容器)
    13. @MapperScan({"xyz.aboluo.dao","xyz.aboluo.dao2"}) //dao接口包扫描
    14. @EnableWebMvc //开启"json数据转换为对象"的功能,方法形参前加@RequestBody(一个方法只能使用1次)
    15. public class SpringConfig {
    16. //事务管理器
    17. @Bean
    18. public DataSourceTransactionManager getDataSourceTransactionManager(DataSource dataSource) {
    19. DataSourceTransactionManager dataSourceTransactionManager = new DataSourceTransactionManager();
    20. dataSourceTransactionManager.setDataSource(dataSource);
    21. return dataSourceTransactionManager;
    22. }
    23. //Spring整合Mybatis
    24. @Bean
    25. @Scope("prototype")
    26. public SqlSessionFactoryBean getSqlSessionFactoryBean(DataSource dataSource, ApplicationContext applicationContext) {
    27. SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
    28. //注入数据源
    29. sqlSessionFactoryBean.setDataSource(dataSource);
    30. //给某一包下的所有JavaBean起别名(类名就是别名,不区分大小写)
    31. sqlSessionFactoryBean.setTypeAliasesPackage("xyz.aboluo.pojo");
    32. //读取mybatis的主配置文件(非必读)
    33. // sqlSessionFactoryBean.setConfigLocation(applicationContext.getResource("classpath:mybatisMain.xml"));
    34. //读取mybatis的映射配置文件(非必读,只要保证xml和dao接口有相同的包路径并且同名即可,或者使用@Select等注解开发)
    35. // List Resources = new ArrayList<>();
    36. // Resources.add(applicationContext.getResource("classpath:xyz/aboluo/dao/UserDao.xml"));
    37. // Resources.add(applicationContext.getResource("classpath:xyz/aboluo/dao/SudokuDao.xml"));
    38. // sqlSessionFactoryBean.setMapperLocations(Resources.toArray(new Resource[0]));
    39. return sqlSessionFactoryBean;
    40. }
    41. //配置dao层接口包扫描(可以用@MapperScan替代)
    42. // @Bean
    43. // public MapperScannerConfigurer getMapperScannerConfigurer() {
    44. // MapperScannerConfigurer mapperScannerConfigurer = new MapperScannerConfigurer();
    45. // mapperScannerConfigurer.setBasePackage("xyz.aboluo.dao");
    46. // return mapperScannerConfigurer;
    47. // }
    48. }
    49. public class DataSourceConfig {
    50. @Value("${mysql.driver}")
    51. private String mysqlDriver;
    52. @Value("${mysql.url}")
    53. private String mysqlUrl;
    54. @Value("${mysql.username}")
    55. private String mysqlUsername;
    56. @Value("${mysql.password}")
    57. private String mysqlPassword;
    58. //数据源
    59. @Bean(name = "dataSource")
    60. public DriverManagerDataSource getDataSource() {
    61. DriverManagerDataSource dataSource = new DriverManagerDataSource();
    62. dataSource.setDriverClassName(mysqlDriver);
    63. dataSource.setUrl(mysqlUrl);
    64. dataSource.setUsername(mysqlUsername);
    65. dataSource.setPassword(mysqlPassword);
    66. return dataSource;
    67. }
    68. }
  • 相关阅读:
    总结tomcat优化方法
    [研发人员必备]paddle 如何制作自己的数据集,并显示。
    机器学习之变分推断(三)基于平均场假设变分推断与广义EM
    邮件协议SMTP、POP3和IMAP
    抗锯齿的线
    freemarker 生成word,支持循环导出图片 WPS版本
    【Spring Boot 】Spring Boot 统一功能处理
    【Qt】Qt下配置OpenCV
    Nsight Compute 是怎么计算Roofline的呢
    【数据结构】堆的实现
  • 原文地址:https://blog.csdn.net/SunnerChen/article/details/132811558