目录
一、Spring的介绍
1. 背景
Spring 框架最早由 Rod Johnson 在 2002 年创立,起初是为了解决 EJB(Enterprise JavaBeans)的繁琐和复杂性。随着时间的推移,Spring 框架逐渐发展成为一个全面的企业级应用框架,提供了从基本的控制反转(IoC)容器到数据访问、事务管理、Web 开发、安全性、集成等各个领域的支持。
2. 优势
-
控制反转(IoC)和依赖注入(DI): Spring 使用 IoC 容器来管理应用程序中的对象,解决了传统的对象创建和管理的问题。通过依赖注入,开发者可以将组件之间的依赖关系从代码中解耦,使代码更加清晰、模块化和可测试。
-
声明式事务管理: Spring 提供了声明式事务管理,使得开发者可以通过配置而不是硬编码来管理事务。这简化了事务管理,提高了代码的可读性和可维护性。
-
AOP(面向切面编程)支持: Spring 支持面向切面编程,允许开发者通过切面将横切关注点(如日志记录、性能监控)与核心业务逻辑分开,提高了代码的模块化和复用性。
-
集成支持: Spring 提供了广泛的集成支持,包括对持久化框架(JDBC、JPA、Hibernate)、消息队列(JMS)、Web 框架(Spring MVC)等的无缝集成,帮助开发者构建综合性的应用。
-
模块化: Spring 框架被分成多个模块,开发者可以根据项目需要选择性地使用不同模块,避免了不必要的复杂性。
3. 作用
-
构建 Web 应用程序:Spring MVC 提供了一个强大的 Web 框架,用于构建响应式的、灵活的 Web 应用程序。
-
数据访问:Spring 提供了对 JDBC、JPA、Hibernate 等持久化框架的集成支持,简化了数据访问层的开发。
-
事务管理:通过声明式事务管理,可以简化数据库事务的管理,确保数据的一致性和完整性。
-
面向切面编程:使用 Spring 的 AOP 支持,可以在不修改核心业务逻辑的情况下,将横切关注点(如日志、安全性)与业务逻辑分开。
-
集成第三方库:Spring 提供了丰富的集成支持,可以轻松地将第三方库(如消息队列、搜索引擎、缓存)集成到应用中。
-
企业级应用开发:Spring 框架提供了各种支持,使开发者能够构建稳健、可扩展的企业级应用程序。
二、Spring应用
1. 引入相关依赖
- spring核心依赖(目前版本最新6.0.11)
<!-- Spring 上下文和 AOP,已经包含了 spring-core 和 spring-beans -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring-version}</version> <!-- 请根据实际版本调整 -->
</dependency>
- 版本控制
<!-- 控制锁定当前模块/项目某块的版本号-->
<properties>
<!-- spring框架相关的版本-->
<spring-version>6.0.11</spring-version>
</properties>
- spring和jdk版本对应关系
2. applicationContext.xml配置文件
构建maven项目后,在resources目录下创建applicationContext.xml文件,其初始内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
</beans>
3. IOC容器使用
(1)创建一个用户类
package com.jay.entity;
/**
* @Author jay_mosu
* @Date 2023/8/15 0015 16:05
* @PackageName com.jay.entity
* @ClassName TUser
* @Description 用户实体类
*/
public class TUser {
private Integer userId;
private String name;
public TUser(Integer userId, String name) {
this.userId = userId;
this.name = name;
}
@Override
public String toString() {
return "TUser{" +
"userId=" + userId +
", name='" + name + '\'' +
'}';
}
public TUser() {
}
public Integer getUserId() {
return userId;
}
public void setUserId(Integer userId) {
this.userId = userId;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
(2)实例化类并输出
传统方式中,我们需要先通过new TUse()的方式才能获取到用户对象 ,而现在通过IOC容器进行获取,在applicationContext.xml中通过添加bean标签并进行相关配置,以此来创建TUser用户对象,具体操作方法如下:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="tUser" class="com.jay.entity.TUser"/>
</beans>
(3)获取容器中的bean对象并输出
@Test
public void test() {
//通过Spring框架提供的加载器从类路径加载XML配置文件并创建应用上下文,可以加载和初始化Spring配置文件中定义的Bean
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
//获取bean对象,通过id进行获取
//这里获取了TUser对象,其id为tUser,然后进行强转
TUser tUser = (TUser) context.getBean("tUser");
//输出
System.out.println(tUser);
}
(4)输出结果如下
这里成功输出了TUser对象中的toString()方法,表示成功获取到了对象。
4. 依赖注入
依赖注入(Dependency Injection,DI)是一种设计模式和编程技术,用于实现对象之间的解耦和依赖关系管理。在依赖注入中,对象的依赖关系不再由对象自身负责创建和管理,而是由外部的容器(通常是框架)来负责。其主要有以下几种注入方式:
(1)setter注入
顾名思义,通过setter方法进行注入,也就是说前提是当前对象需要有setter方法才行,具体操作如下:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="tUser" class="com.jay.entity.TUser">
<property name="userId" value="10"/>
<property name="name" value="张三"/>
</bean>
</beans>
继续上面的测试方法,输出如下:
(2)构造方法注入
同理,需要有相应的构造方法才能进行注入,实现如下:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- <bean id="tUser" class="com.jay.entity.TUser">-->
<!-- <property name="userId" value="10"/>-->
<!-- <property name="name" value="张三"/>-->
<!-- </bean>-->
<bean id="tUser" class="com.jay.entity.TUser">
<constructor-arg name="userId" value="55"/>
<constructor-arg name="name" value="李四"/>
</bean>
</beans>
继续上面的测试方法,输出如下:
注意:构造方法注入要求明确指定依赖关系的参数顺序和数量,确保构造方法的参数与依赖关系一一对应,参数顺序应与构造函数中参数的顺序相匹配。
(3)命名空间注入
- P 命名空间注入: 使用 P 命名空间(Property)来注入依赖关系。这种方式允许你在 XML 配置文件中以属性的形式直接为 Bean 的属性赋值(对应setter注入),示例如下:
<bean id="tUser" class="com.jay.entity.TUser" p:name="李四" p:userId="12"/>
- C 命名空间注入: 使用 C 命名空间(Constructor)来注入构造函数的参数值。这种方式允许你在 XML 配置文件中以构造函数参数的形式为 Bean 的构造函数参数赋值(对应构造注入),示例如下:
<bean id="tUser" class="com.jay.entity.TUser" C:name="李四" C:userId="12"/>
(4)复杂注入
当对象中某个属性不是基本类型或包装类等类型时,不能继续用value进行值的注入,这时候需要根据属性的类型进行不同的赋值方式。
- 创建一个TClass教室对象,并添加需要进行测试的属性。
package com.jay.entity;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
/**
* @Author jay_mosu
* @Date 2023/8/15 0015 16:55
* @PackageName com.jay.entity
* @ClassName THouse
* @Description 房屋实体类对象
*/
public class TLog {
private Integer logId;
private String logContent;
private TUser user;
private List<String> logTagList;
private String[] logArr;
private Map<String,String> logMap;
@Override
public String toString() {
return "TLog{" +
"logId=" + logId +
", logContent='" + logContent + '\'' +
", user=" + user +
", logTagList=" + logTagList +
", logArr=" + Arrays.toString(logArr) +
", logMap=" + logMap +
'}';
}
public TLog() {
}
public Integer getLogId() {
return logId;
}
public void setLogId(Integer logId) {
this.logId = logId;
}
public String getLogContent() {
return logContent;
}
public void setLogContent(String logContent) {
this.logContent = logContent;
}
public TUser getUser() {
return user;
}
public void setUser(TUser user) {
this.user = user;
}
public List<String> getLogTagList() {
return logTagList;
}
public void setLogTagList(List<String> logTagList) {
this.logTagList = logTagList;
}
public String[] getLogArr() {
return logArr;
}
public void setLogArr(String[] logArr) {
this.logArr = logArr;
}
public Map<String, String> getLogMap() {
return logMap;
}
public void setLogMap(Map<String, String> logMap) {
this.logMap = logMap;
}
}
- 编写配置文件,配置bean,并利用setter注入进行属性注入。
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
xmlns:C="http://www.springframework.org/schema/c"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="tUser" class="com.jay.entity.TUser" C:name="李四" C:userId="12"/>
<bean id="tLog" class="com.jay.entity.TLog">
<property name="logId" value="12"/>
<property name="logContent" value="错误日志"/>
<!-- 这里是注入一个对象,不能继续用value,得换成ref,其指向上面已经添加到容器中的TUser对象的id-->
<property name="user" ref="tUser"/>
<!-- 这里是注入一个数组-->
<property name="logArr">
<array>
<value>123</value>
<value>555</value>
<value>777</value>
</array>
</property>
<!-- 这里是注入一个List集合-->
<property name="logTagList">
<list>
<value>123456</value>
<value>787945</value>
<value>555555</value>
</list>
</property>
<!-- 这里是注入一个Map集合-->
<property name="logMap">
<map key-type="java.lang.String" value-type="java.lang.String">
<entry key="123" value="555"/>
</map>
</property>
</bean>
</beans>
- 测试输出
package com.jay;
import com.jay.entity.TLog;
import com.jay.entity.TUser;
import org.junit.Test;
import org.springframework.context.support.ClassPathXmlApplicationContext;
/**
* @Author jay_mosu
* @Date 2023/8/15 0015 17:09
* @PackageName com.jay
* @ClassName TLogTest
* @Description 日志测试类
*/
public class TLogTest {
@Test
public void test() {
//通过Spring框架提供的加载器从类路径加载XML配置文件并创建应用上下文,可以加载和初始化Spring配置文件中定义的Bean
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
//获取bean对象,通过id进行获取
//这里获取了TUser对象,其id为tUser,然后进行强转
TLog tLog = (TLog) context.getBean("tLog");
//输出
System.out.println(tLog);
}
}
- 输出结果
5. Bean的其他属性和生命周期
(1)属性介绍
-
scope:选择bean的创建模式
-
singleton:单例模式(默认)
-
prototype:原型模式(多例)
-
-
destroy-method:销毁时调用的方法
-
init-method:初始化方法
(2)生命周期
实例化bean -> bean属性赋值 -> 初始化bean -> 使用bean -> 销毁bean
(3)使用示例
- 创建一个Student类进行测试
package com.jay.pojo;
/**
* @Author jay_mosu
* @Date 2023/8/15 0015 17:31
* @PackageName com.jay.pojo
* @ClassName Student
* @Description
*/
public class Student {
public Student() {
System.out.println("构造方法");
}
public void init() {
System.out.println("初始方法");
}
public void destroy() {
System.out.println("销毁方法");
}
public void doSomething(){
System.out.println("执行方法");
}
}
- 在xml文件中进行相关配置(默认模式)
<bean id="student" class="com.jay.pojo.Student" init-method="init" destroy-method="destroy"/>
package com.jay;
import com.jay.entity.TLog;
import com.jay.pojo.Student;
import org.junit.Test;
import org.springframework.context.support.ClassPathXmlApplicationContext;
/**
* @Author jay_mosu
* @Date 2023/8/15 0015 17:38
* @PackageName com.jay
* @ClassName StudentTest
* @Description
*/
public class StudentTest {
@Test
public void test_1() {
//通过Spring框架提供的加载器从类路径加载XML配置文件并创建应用上下文,可以加载和初始化Spring配置文件中定义的Bean
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
Student student = (Student) context.getBean("student");
System.out.println(student);
student.doSomething();
context.close();
}
@Test
public void test_2() {
//通过Spring框架提供的加载器从类路径加载XML配置文件并创建应用上下文,可以加载和初始化Spring配置文件中定义的Bean
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
// Student student = (Student) context.getBean("student");
// System.out.println(student);
// student.doSomething();
// context.close();
}
}
测试结果一
测试结果二
- 在原型模式下进行测试
<bean id="student" class="com.jay.pojo.Student" init-method="init" destroy-method="destroy" scope="prototype"/>
测试结果一
测试结果二
(4)小结
在未获取bean时(即只读取加载了配置文件),对于单例模式,会自动实例化已经配置的单例模式的bean对象,并进行赋值和初始化,对于通过ref引入的原型模式的bean只会进行初始化和赋值。而原型模式则不会进行bean的实例化操作,只有获取了某个bean后才会进行实例化。
在上下文关闭时, 单例模式会调用定义的销毁方法,而原型模式不会随之销毁。
6. 实例化方式
(1)构造方法实例化bean
即通过bean标签进行实例化对象。
<bean class="com.jay.entity.TUser" id="tUser"/>
(2)使用静态方法实例化bean
public class OrderDaoFactory {
// 方式二:静态方法-->
public static OrderDao getOrderDao(){
return new OrderDaoimpl();
}
}
<bean id="orderDao" class="com.jay.factory.OrderDaoFactory" factory-method="getOrderDao"/>
(3)使用实例化工厂实例化bean
public class OrderDaoFactory {
// 方式三:工厂实例化
public OrderDao getorderDao(){
return new OrderDaoimpl();
}
}
<bean id="orderFactory" class="com.jay.factory.OrderDaoFactory"/>
<bean id="OrderDao" factory-bean="orderFactory" factory-method="getorderDao"/>
(4)使用FactoryBean实例化bean
public class OrderDaoFactoryBean implements FactoryBean<OrderDao> {
// 方式四:代替原始实例工厂中创建的方法
public OrderDao getObject() throws Exception {
return new OrderDaoimpl();
}
public Class<?> getObjectType() {
return OrderDao.class;
}
//控制是否单例
public boolean isSingleton() {
return false;
}
}
<bean id="orderdao" class="com.jay.OrderDaoFactoryBean"/>
7. 使用Spring配置数据源
- 导入相关依赖
<!-- mysql驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.28</version>
</dependency>
<!-- 建立一个jdbc的连接,没有连接池作用-->
<!-- https://mvnrepository.com/artifact/org.springframework/spring-jdbc -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${spring-version}</version>
</dependency>
<!-- c3p0连接池-->
<!-- https://mvnrepository.com/artifact/com.mchange/c3p0 -->
<dependency>
<groupId>com.mchange</groupId>
<artifactId>c3p0</artifactId>
<version>0.9.5.5</version>
</dependency>
<!-- druid连接池-->
<!-- https://mvnrepository.com/artifact/com.alibaba/druid -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.2.18</version>
</dependency>
<!-- dbcp连接池-->
<!-- https://mvnrepository.com/artifact/org.apache.commons/commons-dbcp2 -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-dbcp2</artifactId>
<version>2.9.0</version>
</dependency>
- 在XML中配置连接池
<?xml version="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"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
<context:property-placeholder location="classpath:jdbc.properties"/>
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</bean>
<bean id="comboPooledDataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="${jdbc.driver}"></property>
<property name="jdbcUrl" value="${jdbc.url}"></property>
<property name="user" value="${jdbc.username}"></property>
<property name="password" value="${jdbc.password}"></property>
<!-- c3p0连接池的私有属性-->
<property name="maxPoolSize" value="10"/>
<property name="minPoolSize" value="5"/>
<!-- 关闭连接后,不自动commit-->
<property name="autoCommitOnClose" value="false"/>
<!-- 获取连接超时时间-->
<property name="checkoutTimeout" value="10000"/>
<!-- 当获取连接失败重试次数-->
<property name="acquireRetryAttempts" value="2"/>
</bean>
<bean id="druidDataSource" class="com.alibaba.druid.pool.DruidDataSource">
<property name="driverClassName" value="${jdbc.driver}"></property>
<property name="url" value="${jdbc.url}"></property>
<property name="username" value="${jdbc.username}"></property>
<property name="password" value="${jdbc.password}"></property>
</bean>
<bean id="basicDataSource" class="org.apache.commons.dbcp2.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</bean>
</beans>
- 引入配置文件
通过下面的标签引入properties配置文件。
<context:property-placeholder location="classpath:jdbc.properties"/>
- 配置文件内容(jdbc.properties)
jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/test_database?serverTimezone=GMT&useSSL=false
jdbc.username=root
jdbc.password=root
8. spring配置文件常用标签
-
<beans>
标签:<beans>
是 Spring 配置文件的根元素,用于包含所有的配置内容。在该标签内部可以定义各种 Bean,配置依赖关系、切面等。 -
<bean>
标签:<bean>
标签用于定义一个 Spring Bean。你可以在这里配置 Bean 的 ID、类名、作用域、属性、依赖关系等。 -
<import>
标签:<import>
标签用于导入其他 Spring 配置文件,以便在一个配置文件中组合多个配置。 -
<property>
标签:<property>
标签用于在 Bean 配置中设置属性的值。可以使用该标签为 Bean 的属性赋予值,包括基本类型、字符串、引用等。 -
<constructor-arg>
标签:<constructor-arg>
标签用于在构造方法注入中指定参数的值。可用于构造方法参数的注入。 -
<alias>
标签:<alias>
标签用于为 Bean 定义一个别名,可以让你在应用中使用不同的名称来引用同一个 Bean。 -
<qualifier>
标签:<qualifier>
标签用于限定符注入,当存在多个相同类型的 Bean 时,可以使用限定符指定具体注入哪个 Bean。 -
<property-placeholder>
标签:<property-placeholder>
标签用于在配置文件中引用外部属性文件中的属性值,方便在配置文件中进行属性的动态配置。 -
<util:list>
和<util:set>
标签: 这些标签用于定义列表和集合类型的属性。可以用于注入集合类型的依赖关系。 -
<util:map>
和<util:properties>
标签: 这些标签用于定义映射和属性类型的属性。可以用于注入映射和属性类型的依赖关系。 -
<context:component-scan>
标签:<context:component-scan>
标签用于配置自动扫描,以便 Spring 能够自动发现和注册带有@Component
注解的 Bean。 -
<aop:config>
标签:<aop:config>
标签用于配置面向切面编程(AOP),定义切面、切点、通知等。 -
<tx:advice>
和<tx:attributes>
标签: 这些标签用于配置声明式事务管理,定义事务通知和事务属性。 -
<mvc:annotation-driven>
标签:<mvc:annotation-driven>
标签用于配置 Spring MVC,启用基于注解的 MVC 控制器。 -
<mvc:view-resolvers>
标签:<mvc:view-resolvers>
标签用于配置 Spring MVC 的视图解析器,将逻辑视图名称解析为实际视图。 -
<mvc:resources>
标签:<mvc:resources>
标签用于配置 Spring MVC 的静态资源处理,如 CSS、JavaScript 文件等。 -
<mvc:interceptors>
标签:<mvc:interceptors>
标签用于配置 Spring MVC 的拦截器,用于处理请求的预处理和后处理。 -
<mvc:default-servlet-handler>
标签:<mvc:default-servlet-handler>
标签用于配置 Spring MVC 默认的 Servlet 处理,将请求转发给默认的 Servlet。
三、Spring注解编程
1. spring常用注解
-
@Component
注解: 将类标记为一个 Spring 组件,使其成为 Spring 容器管理的 Bean。通常用于标记普通的 POJO 类。 -
@Repository
、@Service
、@Controller
注解: 这些注解分别用于标记数据访问层、业务逻辑层和控制器层的 Bean。 -
@Autowired
注解: 用于自动装配依赖,将依赖对象注入到 Bean 中。 -
@Qualifier
注解: 用于在存在多个同类型 Bean 时,指定特定的 Bean 进行注入。 -
@Value
注解: 用于将属性值从配置文件中注入到 Bean 的属性。 -
@Configuration
注解: 声明一个配置类,类似于 XML 配置文件。 -
@Bean
注解: 在配置类中定义一个 Bean。 -
@Import
注解: 导入其他配置类。 -
@ComponentScan
注解: 指定要扫描的包路径,自动注册 Bean。 -
@Aspect
注解: 声明一个切面类,进行面向切面编程。 -
@Pointcut
注解: 定义切点,指定切面的连接点。 -
@Before
、@After
、@AfterReturning
、@AfterThrowing
、@Around
注解: 定义不同类型的通知(Advice)。 -
@Transactional
注解: 声明事务属性和行为。 -
@Scope
注解: 定义 Bean 的作用域。 -
@Lazy
注解: 延迟初始化 Bean。 -
@DependsOn
注解: 指定 Bean 依赖的其他 Bean。 -
@PropertySource
注解: 加载外部属性文件。 -
@Profile
注解: 激活指定的配置文件。 -
@Primary
注解: 在存在多个相同类型 Bean 时,指定首选的 Bean。 -
@Conditional
注解: 根据条件来决定是否创建 Bean。 -
@EnableTransactionManagement
注解: 启用声明式事务管理。 -
@ImportResource
注解: 导入 XML 配置文件。
注:使用spring注解编程时需要配置扫描,确保容器能够扫描到这些注解,在spring配置文件中的需要使用<context:component-scan base-package="com.jay"/>来进行扫描,而对于的注解则是@ComponentScan("com.jay")。
2. spring配置类注解使用
在spring中,可以用纯注解来替代applicationContext.xml配置文件,以上面的实例进行为例,将配置文件全部替换为注解形式。
(1)配置Spring配置类
@Configuration
@ComponentScan("com.jay")
public class SpringConfig {
}
(2)使用注解注册bean和属性注入
package com.jay.entity;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
/**
* @Author jay_mosu
* @Date 2023/8/15 0015 16:05
* @PackageName com.jay.entity
* @ClassName TUser
* @Description 用户实体类
*/
@Component
public class TUser {
@Value("11")
private Integer userId;
@Value("张三")
private String name;
public TUser(Integer userId, String name) {
this.userId = userId;
this.name = name;
}
@Override
public String toString() {
return "TUser{" +
"userId=" + userId +
", name='" + name + '\'' +
'}';
}
public TUser() {
}
public Integer getUserId() {
return userId;
}
public void setUserId(Integer userId) {
this.userId = userId;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
package com.jay.entity;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
/**
* @Author jay_mosu
* @Date 2023/8/15 0015 16:55
* @PackageName com.jay.entity
* @ClassName THouse
* @Description 房屋实体类对象
*/
@Component
public class TLog {
@Value("123")
private Integer logId;
@Value("我是spring配置类测试内容")
private String logContent;
@Autowired
private TUser tUser;
@Override
public String toString() {
return "TLog{" +
"logId=" + logId +
", logContent='" + logContent + '\'' +
", tUser=" + tUser +
'}';
}
public TLog() {
}
public Integer getLogId() {
return logId;
}
public void setLogId(Integer logId) {
this.logId = logId;
}
public String getLogContent() {
return logContent;
}
public void setLogContent(String logContent) {
this.logContent = logContent;
}
public TUser gettUser() {
return tUser;
}
public void settUser(TUser tUser) {
this.tUser = tUser;
}
}
(3)测试输入(注解方式)
在测试前,先集成spring和junit4,依赖如下:
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>${spring-version}</version>
</dependency>
测试类代码如下:
package com.jay;
import com.jay.config.SpringConfig;
import com.jay.entity.TLog;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
/**
* @Author jay_mosu
* @Date 2023/8/16 0016 11:19
* @PackageName com.jay
* @ClassName TLogConfigTest
* @Description
*/
@RunWith(SpringJUnit4ClassRunner.class)//集成
@ContextConfiguration(classes = SpringConfig.class)//指定配置文件
public class TLogConfigTest {
@Autowired
private TLog tLog;
@Test
public void name() {
System.out.println(tLog);
}
}
(4)配置第三方类
package com.jay.config;
import com.alibaba.druid.pool.DruidDataSource;
import com.mchange.v2.c3p0.ComboPooledDataSource;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.jdbc.datasource.DriverManagerDataSource;
import org.springframework.stereotype.Component;
import javax.sql.DataSource;
import java.beans.PropertyVetoException;
/**
* @Author jay_mosu
* @Date 2023/8/16 0016 11:02
* @PackageName com.jay.config
* @ClassName SpringConfig
* @Description Spring配置文件
*/
@Configuration
@ComponentScan(value = "com.jay")
public class SpringConfig {
@Value("${jdbc.driver}")
private String driverName;
@Value("${jdbc.url}")
private String url;
@Value("${jdbc.username}")
private String username;
@Value("${jdbc.password}")
private String password;
// 普通的jdbc连接
@Bean
public DataSource driverManagerDataSource(){
DriverManagerDataSource driverManagerDataSource = new DriverManagerDataSource();
driverManagerDataSource.setDriverClassName(driverName);
driverManagerDataSource.setUrl(url);
driverManagerDataSource.setUsername(username);
driverManagerDataSource.setPassword(password);
return driverManagerDataSource;
}
// c3p0连接池配置
@Bean
public DataSource comboPooledDataSource(){
try {
ComboPooledDataSource comboPooledDataSource = new ComboPooledDataSource();
comboPooledDataSource.setDriverClass(driverName);
comboPooledDataSource.setJdbcUrl(url);
comboPooledDataSource.setUser(username);
comboPooledDataSource.setPassword(password);
return comboPooledDataSource;
} catch (PropertyVetoException e) {
throw new RuntimeException(e);
}
}
// druid连接池
@Bean
public DataSource druidDataSource(){
DruidDataSource druidDataSource = new DruidDataSource();
druidDataSource.setDriverClassName(driverName);
druidDataSource.setUrl(url);
druidDataSource.setUsername(username);
druidDataSource.setPassword(password);
return druidDataSource;
}
// dbcp连接池
@Bean
public DataSource basicDataSource(){
BasicDataSource basicDataSource = new BasicDataSource();
basicDataSource.setDriverClassName(driverName);
basicDataSource.setUrl(url);
basicDataSource.setUsername(username);
basicDataSource.setPassword(password);
return basicDataSource;
}
}
四、总结
Spring IoC 容器是 Spring 框架的核心之一,它提供了强大的对象管理、依赖注入、生命周期管理等功能,帮助开发人员创建松散耦合的应用程序,提高可维护性和可测试性。无论是传统的 XML 配置还是基于注解的配置,都可以使用 Spring IoC 容器来管理和维护对象。