IoC :Inverse of Control 的简写,译为“控制反转”,指把创建对象过程交给 Spring 进行管理。
AOP:Aspect Oriented Programming 的简写,译为“面向切面编程”。AOP 用来封装多个类的公共行为,将那些与业务无关,却为业务模块所共同调用的逻辑封装起来,减少系统的重复代码,降低模块间的耦合度。另外,AOP 还解决一些系统层面上的问题,比如日志、事务、权限等。
控制反转依靠依赖注入(DI)实现,主要有两种形式:构造器注入,set方法注入。
其中默认使用无参构造器创建对象
下面给出一个实例
无参构造器创建对象
依赖配置pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.example</groupId>
<artifactId>demo1</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<!--spring context依赖-->
<!--当你引入Spring Context依赖之后,表示将Spring的基础依赖引入了-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>6.0.2</version>
</dependency>
<!--junit5测试-->
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<version>5.3.1</version>
</dependency>
</dependencies>
</project>
bean.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">
<bean id="hiWorld" class="cn.amebob.HiCodeWorld"> </bean>
</beans>
测试类
public class TestForDemo1 {
@Test
public void HiCodeWorld(){
ApplicationContext context = new ClassPathXmlApplicationContext("ioc.xml");
HiCodeWorld helloWorld = (HiCodeWorld) context.getBean("hiWorld");
}
}
实体类
public class HiCodeWorld {
public HiCodeWorld() {
System.out.println("Hello World!");
}
}
可以看到构造器中的打印函数执行了。

Spring读取bean.xml文件,借用反射机制创建对象,将对象放于map中
set注入
bean配置
<bean id="studentOne" class="cn.amebob.Student">
<!-- property标签:通过组件类的setXxx()方法给组件对象设置属性 -->
<!-- name属性:指定属性名(这个属性名是getXxx()、setXxx()方法定义的,和成员变量无关) -->
<!-- value属性:指定属性值 -->
<property name="id" value="1001"></property>
<property name="name" value="张三"></property>
<property name="age" value="23"></property>
<property name="sex" value="男"></property>
</bean>
student类,这里并没有设置有参构造器
package cn.amebob;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class Student {
private Logger logger = LoggerFactory.getLogger(Student.class);
private Integer id;
private String name;
private Integer age;
private String sex;
public Student() {
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
logger.info(" ");
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
logger.info(" ");
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
logger.info(" ");
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
logger.info(" ");
this.sex = sex;
}
@Override
public String toString() {
return "Student{" +
"id=" + id +
", name='" + name + '\'' +
", age=" + age +
", sex='" + sex + '\'' +
'}';
}
}

测试方法
@Test
public void StudentSetTest(){
ApplicationContext context = new ClassPathXmlApplicationContext("spring-di.xml");
Student student = (Student) context.getBean("studentOne");
logger.info(student.toString());
}

构造器注入
Student类中的有参构造器(新加的)
public Student(Integer id, String name, Integer age, String sex) {
this.id = id;
this.name = name;
this.age = age;
this.sex = sex;
logger.info("有参构造器执行");
}
测试代码
@Test
public void StudentSetTest(){
ApplicationContext context = new ClassPathXmlApplicationContext("spring-di.xml");
//测试set注入
Student student = (Student) context.getBean("studentOne");
logger.info(student.toString());
//测试constructor注入
Student student2 = (Student) context.getBean("studentTwo");
logger.info(student2.toString());
}
bean配置
<bean id="studentTwo" class="cn.amebob.Student">
<constructor-arg value="1002"></constructor-arg>
<constructor-arg value="张三"></constructor-arg>
<constructor-arg value="23"></constructor-arg>
<constructor-arg value="女"></constructor-arg>
</bean>

注入引用类型(对象引用)
仅展示一种方法,其他方法略(后续使用注解方式)

测试代码
Student student3 = (Student) context.getBean("studentThree");//注意这里,我们已将上图bean配置的studentFour改为studentThree
logger.info(student3.toString());

引入命名空间p(简化xml下赋值)
bean配置文件
<!-- 引入p命名空间,简化xml方式为类属性赋值-->
<bean id="studentFour" class="cn.amebob.Student"
p:id="1004" p:name="小明" p:clazz-ref="clazzOne"></bean>

测试代码
Student student4 = (Student) context.getBean("studentFour");
logger.info(student4.toString());

引入外部属性文件
这里的例子是引入基于xml配置的德鲁伊数据库连接池
从下图中可以看到,我们将数据库连接信息存放在jdbc.properties中,在bean配置文件中指明该文件(jdbc.properties)的位置(存放在类路径下,即resources文件夹下)。spirng将根据下面的bean配置创建一个druidDataSource实例,并注入相关配置

jdbc.properties
jdbc.user=root
jdbc.password=root
jdbc.url=jdbc:mysql://localhost:3306/demo1?serverTimezone=UTC
jdbc.driver=com.mysql.cj.jdbc.Driver
pom.xml
<!-- MySQL驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.30</version>
</dependency>
<!-- 数据连接池-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.2.15</version>
</dependency>
测试代码
@Test
public void testDataSource() throws SQLException {
ApplicationContext ac = new ClassPathXmlApplicationContext("spring-di.xml");
DataSource dataSource = ac.getBean(DataSource.class);
Connection connection = dataSource.getConnection();
System.out.println(connection);
}

beanscope
<!-- scope属性:取值singleton(默认值),bean在IOC容器中只有一个实例,IOC容器初始化时创建对象 -->
<!-- scope属性:取值prototype,bean在IOC容器中可以有多个实例,getBean()时创建对象 -->
<bean class="cn.amebob.User" scope="prototype"></bean>
One thought on “[JAVAEE]Spring”