文章目录
一、什么是Spring?
Spring是一个开源的、轻量级的控制反转(IOC)和面向切面编程(AOP)的Java开发框架,目的是为了简化代码。
二、什么是控制反转IOC?
百度百科给出的解释为:
控制反转(Inversion of Control,缩写为IoC),是面向对象编程中的一种设计原则,可以用来减低计算机代码之间的耦合度。其中最常见的方式叫做依赖注入(Dependency Injection,简称DI),还有一种方式叫“依赖查找”(Dependency Lookup)。通过控制反转,对象在被创建的时候,由一个调控系统内所有对象的外界实体将其所依赖的对象的引用传递给它。也可以说,依赖被注入到对象中。
我的理解为:
程序本身不以new的方式创建对象,而是以依赖注入的方式被动接受对象。将创建对象的主动权变为被动接入。
例如:之前若要修改某个参数,则需要将代码中有该参数关联的地方都修改,修改代价高。而用spring,则是给这个参数一个依赖注入方法。通过spring中的配置文件修改传入的参数即可。对象由Spring创建、管理和装配。
三、采用Spring配置文件.xml实现IOC
目标:通过修改配置文件beans.xml中的参数值,改变传入测试类User中属性username的值。
1. 导入包
利用maven导入spring-webmvc包
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.3.2</version>
</dependency>
2. 给定一个测试实体类User
public class User {
private String username;
// 测试有参构造代码。(依赖注入的方式:构造器注入)
// 测试无参构造时无需该代码。(依赖注入的方式:基于set()通过调用无参的构造函数或者无参的static fatory method实例化beans)
public User(String username) {
this.username = username;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public void show(){
System.out.println(this.username);
}
}
3. 在.xml文件中IOC创建对象的方式
- 创建beans.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
https://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="accountDao"
class="org.springframework.samples.jpetstore.dao.jpa.JpaAccountDao">
<!-- additional collaborators and configuration for this bean go here -->
</bean>
<bean id="itemDao" class="org.springframework.samples.jpetstore.dao.jpa.JpaItemDao">
<!-- additional collaborators and configuration for this bean go here -->
</bean>
<!-- more bean definitions for data access objects go here -->
</beans>
1)无参构造
bean为一个对象;id为创建对象的变量名,是bean的唯一标识;class是创建对象时“new 类型”中的类型类;name为id的别名,可有多个别名;property为对象的属性,其中name为属性名,value为给该属性赋值,ref为引用Spring容器中创建好的对象。
<bean id="username" class="com.yumi.User" name="u1,u2">
<property name="str" value="Spring"></property>
<!-- collaborators and configuration for this bean go here -->
</bean>
2)有参构造
<bean id="username" class="com.yumi.User">
<!-- 1.下标赋值 -->
<constructor-arg index="0" value="yumi"></constructor-arg>
</bean>
<bean id="username" class="com.yumi.User">
<!-- 2.类型创建,但是多个参数为同一类型则无法使用 -->
<constructor-arg type="java.lang.String" value="yumi"></constructor-arg>
</bean>
<bean id="username" class="com.yumi.User" name="u1,u2,u3">
<!-- 3.直接通过参数名赋值 -->
<constructor-arg name="username" value="yumi"></constructor-arg>
</bean>
4. 测试
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class MyTest {
public static void main(String[] args) {
// ApplicationContext为容器接口,容器在初始化时先去读取配置文件.xml文件,可传多个配置文件
ApplicationContext classPathXmlApplicationContext = new ClassPathXmlApplicationContext("beans.xml");
// 根据配置文件或元数据创建与组织对象存入容器中。程序使用时再从IOC容器中取出需要的对象。在配置文件加载时,容器中管理的对象就已经初始化了。
// 有参构造,可使用别名u1,u2..获取参数内容。
User user = (User) classPathXmlApplicationContext.getBean("username");
user.show();
}
}
5. 在.xml中Bean的其他配置
- alias:别名。可通过别名获取参数。
<alias name="username" alias="u"></alias>`
- import:为团队合作时将多个配置文件导入到一个配置文件中。
<import resource="beans.xml"></import>
<import resource="beans1.xml"></import>