目录
3.1.1 ApplicationContext的主要实现类
3.1.3.1 ClassPathXmlApplicationContext
3.1.3.2 AnnotationConfigApplicationContext
3.2 依赖注入DI(Dependency Injection)
(1) IDEA开发工具: 2022.3.3
(2) JDK: Java17+
(3) Maven: 3.6+
(4) Spring: 6+
- <dependencies>
-
- <dependency>
- <groupId>org.springframeworkgroupId>
- <artifactId>spring-contextartifactId>
- <version>${spring-version}version>
- dependency>
-
-
- <dependency>
- <groupId>org.junit.jupitergroupId>
- <artifactId>junit-jupiter-apiartifactId>
- <version>5.10.0version>
- dependency>
-
-
- <dependency>
- <groupId>org.slf4jgroupId>
- <artifactId>slf4j-apiartifactId>
- <version>2.0.9version>
- dependency>
-
- <dependency>
- <groupId>ch.qos.logbackgroupId>
- <artifactId>logback-classicartifactId>
- <version>1.4.11version>
- dependency>
-
- <dependency>
- <groupId>org.apache.logging.log4jgroupId>
- <artifactId>log4j-coreartifactId>
- <version>2.20.0version>
- dependency>
-
-
- <dependency>
- <groupId>org.springframeworkgroupId>
- <artifactId>spring-aopartifactId>
- <version>${spring-version}version>
- dependency>
-
- <dependency>
- <groupId>org.springframeworkgroupId>
- <artifactId>spring-aspectsartifactId>
- <version>${spring-version}version>
- dependency>
-
-
-
-
- <dependency>
- <groupId>com.mysqlgroupId>
- <artifactId>mysql-connector-jartifactId>
- <version>8.1.0version>
- dependency>
-
- <dependency>
- <groupId>org.mybatisgroupId>
- <artifactId>mybatisartifactId>
- <version>3.5.13version>
- dependency>
-
- <dependency>
- <groupId>org.mybatisgroupId>
- <artifactId>mybatis-springartifactId>
- <version>3.0.2version>
- dependency>
-
-
- <dependency>
- <groupId>com.alibabagroupId>
- <artifactId>druidartifactId>
- <version>1.2.19version>
- dependency>
-
- <dependency>
- <groupId>com.mchangegroupId>
- <artifactId>c3p0artifactId>
- <version>0.9.5.5version>
- dependency>
-
- <dependency>
- <groupId>org.springframeworkgroupId>
- <artifactId>spring-jdbcartifactId>
- <version>${spring-version}version>
- dependency>
-
- <dependency>
- <groupId>org.springframeworkgroupId>
- <artifactId>spring-txartifactId>
- <version>${spring-version}version>
- dependency>
-
-
- <dependency>
- <groupId>com.alibaba.fastjson2groupId>
- <artifactId>fastjson2artifactId>
- <version>2.0.41version>
- dependency>
-
- <dependency>
- <groupId>com.fasterxml.jackson.coregroupId>
- <artifactId>jackson-databindartifactId>
- <version>2.15.2version>
- dependency>
-
-
-
- <dependency>
- <groupId>jakarta.servletgroupId>
- <artifactId>jakarta.servlet-apiartifactId>
- <version>6.0.0version>
- <scope>providedscope>
- dependency>
-
- <dependency>
- <groupId>org.apache.tomcatgroupId>
- <artifactId>tomcat-apiartifactId>
- <version>10.1.13version>
- dependency>
-
- <dependency>
- <groupId>org.springframeworkgroupId>
- <artifactId>spring-webmvcartifactId>
- <version>${spring-version}version>
- dependency>
-
-
- <dependency>
- <groupId>commons-langgroupId>
- <artifactId>commons-langartifactId>
- <version>2.6version>
- dependency>
-
-
- <dependency>
- <groupId>com.github.qcloudsmsgroupId>
- <artifactId>qcloudsmsartifactId>
- <version>1.0.6version>
- dependency>
-
-
- <dependency>
- <groupId>org.apache.poigroupId>
- <artifactId>poiartifactId>
- <version>5.2.3version>
- dependency>
-
- <dependency>
- <groupId>org.apache.poigroupId>
- <artifactId>poi-ooxmlartifactId>
- <version>5.2.3version>
- dependency>
-
-
- <dependency>
- <groupId>redis.clientsgroupId>
- <artifactId>jedisartifactId>
- <version>3.5.2version>
- dependency>
- <dependency>
- <groupId>org.apache.commonsgroupId>
- <artifactId>commons-pool2artifactId>
- <version>2.10.0version>
- dependency>
-
- dependencies>
- "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"
- xmlns:aop="http://www.springframework.org/schema/aop"
- xmlns:tx="http://www.springframework.org/schema/tx"
- xmlns:p="http://www.springframework.org/schema/p"
- xmlns:mvc="http://www.springframework.org/schema/mvc"
- 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
- http://www.springframework.org/schema/aop
- http://www.springframework.org/schema/aop/spring-aop.xsd
- http://www.springframework.org/schema/tx
- http://www.springframework.org/schema/tx/spring-tx.xsd
- http://www.springframework.org/schema/mvc
- http://www.springframework.org/schema/mvc/spring-mvc.xsd">
-
-
- <context:property-placeholder location="classpath:config.properties" file-encoding="utf-8"/>
-
-
- <context:component-scan base-package="xyz.aboluo" use-default-filters="false">
- <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
- <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
- context:component-scan>
-
-
- <aop:aspectj-autoproxy/>
-
-
- <bean id="user" class="xyz.aboluo.User">
-
- <property name="name" value="${aaa}">property>
- <property name="age" ref="${bbb}">property>
-
- <constructor-arg name="hobby" value="${ccc}"/>
- bean>
-
-
- <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
- <property name="driverClassName" value="${mysql.driver}"/>
- <property name="url" value="${mysql.url}"/>
- <property name="username" value="${mysql.username}"/>
- <property name="password" value="${mysql.password}"/>
- bean>
-
- <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
- <property name="driverClassName" value="${mysql.driver}"/>
- <property name="url" value="${mysql.url}"/>
- <property name="username" value="${mysql.username}"/>
- <property name="password" value="${mysql.password}"/>
- bean>
-
- <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
- <property name="driverClass" value="${mysql.driver}"/>
- <property name="jdbcUrl" value="${mysql.url}"/>
- <property name="user" value="${mysql.username}"/>
- <property name="password" value="${mysql.password}"/>
- bean>
-
- <bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
- <property name="dataSource" ref="dataSource"/>
- bean>
-
- <tx:annotation-driven transaction-manager="txManager"/>
-
-
- <import resources="spring.xml"/>
- beans>
底层核心原理是JAVA反射
IOC(Inversion Of Control)控制反转(创建对象不再时通过new,而是交给IOC容器)
Spring通过IOC容器来管理所有JAVA对象的实例化和初始化、控制对象与对象之间的依赖关系,这些由IOC容器管理的JAVA对象称为Spring Bean(它与由关键字new创建的JAVA对象没有任何区别)
BeanFactory是IOC容器的基本实现,是Spring内部使用的接口,不向开发人员提供
ApplicationContext是BeanFactory的子接口,提供了更多高级特性,面向开发者(几乎所有场合都可以使用ApplicationContext,而不是更底层的BeanFactory)
| 实现类 | 简介 |
| ClassPathXmlApplicationContext | 通过读取类路径下的xml配置文件创建IOC容器对象 |
| AnnotationConfigApplicationContext | 通过读取配置类创建IOC容器对象 |
- @Test
- public void userTest() {
- // 加载spring配置文件,创建"容器对象"
- ApplicationContext context = new ClassPathXmlApplicationContext("bean.xml");
- // 从容器中获取对应的对象
- User user = context.getBean("user", User.class);
- // 使用对象
- user.aaa();
- }
- @Test
- public void userTest() {
- // 加载spring配置类,创建"容器对象"
- ApplicationContext context = new AnnotationConfigApplicationContext(SpringConfig.class);
- // 从容器中获取对应的对象
- User user = context.getBean("user", User.class);
- // 使用对象
- user.aaa();
- }
在Spring创建对象过程中,注入对象依赖的属性:
(1) set注入: 有空参构造方法,和对应的set方法
(2) 构造注入: 有对应的构造方法
(3) 注解注入: 有空参构造方法
被注解的类必须有空参构造方法
这些注解不能写在接口上,要写在类上
| 注解 | 说明 |
| @Component | 默认使用类名(首字母小写) |
| @Controller | 通常用于控制层,功能与@Component相同 |
| @Service | 通常用于业务层,功能与@Component相同 |
| @Repository | 通常用于数据访问层,功能与@Component相同 |
| 注解 | 说明 |
| @Autowired | 根据类型去IOC容器匹配类/类的子类/接口实现类 可以用在类或方法上 |
| @Qualifier("名称") | 要配合@Autowired使用 根据类型和名称去IOC容器进行匹配 |
| @Value("值")或("${key}") | 基本数据类型和String类型 不能用作静态变量(static),不能用作常量(final) |
@Autowired不能作用在静态成员上,但可以在类中先声明静态成员变量,然后用@Autowired作用在非静态set方法上来进行属性注入,间接达到"静态依赖注入"的效果
- @Component
- public class Common {
- /**
- * 静态声明
- */
- private static StringRedisTemplate stringRedisTemplate;
-
- @Autowired
- public void setStringRedisTemplate(StringRedisTemplate stringRedisTemplate) {
- Common.stringRedisTemplate = stringRedisTemplate;
- }
- }
用配置类来替代xml配置文件
| 注解 | 说明 |
| @Import | 用在Spring配置类上 可以引入配置类 也可以引入Controller,Service,POJO等类,被@Import引入的类可以不写@Component,@Service等注解,依然会被注册进SpringIOC容器 |
| @Scope("singleton/prototype") | 用于指定bean对象的作用范围(默认singleton) 可以不配合单独使用,该bean被@Import引入Spring配置类即可生效 可以配合@Component等注解,也可以配合@Bean注解 |
| @Bean | 将方法的返回值作为Bean交给SpringIOC容器管理 如果方法需要参数,会从IOC容器获取(默认按类型注入/多个匹配按形参名注入) |
- @Configuration //配置类注解
- @Import({DataSourceConfig.class,TransactionConfig.class}) //将类注册进SpringIOC容器 ; 引入其他配置类
- @ComponentScan(value = "xyz.aboluo", excludeFilters = @ComponentScan.Filter(
- type = FilterType.ANNOTATION, //按注解类型过滤(不扫描)
- classes = {Controller.class, Service.class}
- ), includeFilters = @ComponentScan.Filter(
- type = FilterType.ANNOTATION, //按注解类型过滤(只扫描)
- classes = {Controller.class, Service.class}
- )) //开启组件扫描(配置类也要在其中)
- @PropertySource(value = "config.properties", encoding = "utf-8") //引入properties文件
- @EnableAspectJAutoProxy //开启Spring对”注解AOP”的支持
- @EnableTransactionManagement //开启Spring对”注解事务”的支持(需要有对应的"事务管理器"交给SpringIOC容器)
- @MapperScan({"xyz.aboluo.dao","xyz.aboluo.dao2"}) //dao接口包扫描
- @EnableWebMvc //开启"json数据转换为对象"的功能,方法形参前加@RequestBody(一个方法只能使用1次)
- public class SpringConfig {
- //事务管理器
- @Bean
- public DataSourceTransactionManager getDataSourceTransactionManager(DataSource dataSource) {
- DataSourceTransactionManager dataSourceTransactionManager = new DataSourceTransactionManager();
- dataSourceTransactionManager.setDataSource(dataSource);
- return dataSourceTransactionManager;
- }
-
- //Spring整合Mybatis
- @Bean
- @Scope("prototype")
- public SqlSessionFactoryBean getSqlSessionFactoryBean(DataSource dataSource, ApplicationContext applicationContext) {
- SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
- //注入数据源
- sqlSessionFactoryBean.setDataSource(dataSource);
- //给某一包下的所有JavaBean起别名(类名就是别名,不区分大小写)
- sqlSessionFactoryBean.setTypeAliasesPackage("xyz.aboluo.pojo");
- //读取mybatis的主配置文件(非必读)
- // sqlSessionFactoryBean.setConfigLocation(applicationContext.getResource("classpath:mybatisMain.xml"));
- //读取mybatis的映射配置文件(非必读,只要保证xml和dao接口有相同的包路径并且同名即可,或者使用@Select等注解开发)
- // List
Resources = new ArrayList<>(); - // Resources.add(applicationContext.getResource("classpath:xyz/aboluo/dao/UserDao.xml"));
- // Resources.add(applicationContext.getResource("classpath:xyz/aboluo/dao/SudokuDao.xml"));
- // sqlSessionFactoryBean.setMapperLocations(Resources.toArray(new Resource[0]));
- return sqlSessionFactoryBean;
- }
-
- //配置dao层接口包扫描(可以用@MapperScan替代)
- // @Bean
- // public MapperScannerConfigurer getMapperScannerConfigurer() {
- // MapperScannerConfigurer mapperScannerConfigurer = new MapperScannerConfigurer();
- // mapperScannerConfigurer.setBasePackage("xyz.aboluo.dao");
- // return mapperScannerConfigurer;
- // }
- }
-
- public class DataSourceConfig {
- @Value("${mysql.driver}")
- private String mysqlDriver;
- @Value("${mysql.url}")
- private String mysqlUrl;
- @Value("${mysql.username}")
- private String mysqlUsername;
- @Value("${mysql.password}")
- private String mysqlPassword;
-
- //数据源
- @Bean(name = "dataSource")
- public DriverManagerDataSource getDataSource() {
- DriverManagerDataSource dataSource = new DriverManagerDataSource();
- dataSource.setDriverClassName(mysqlDriver);
- dataSource.setUrl(mysqlUrl);
- dataSource.setUsername(mysqlUsername);
- dataSource.setPassword(mysqlPassword);
- return dataSource;
- }
- }