Spring
Spring框架是Java开发领域中最流行的框架之一,它简化了企业级应用的开发。
核心概念
- 依赖注入(DI): Spring通过DI来管理对象之间的依赖关系。
- Spring容器: 负责创建、配置和管理对象。
- IoC控制反转:对象的创建控制权由程序转移到外部
快速入门
首先了解传统案例项目的结构
puiblic class UserDao{
public void save(){
System.out.println("userDao-->run!");
}
}
public class UserService{
private UserDao userDao = new UserDaoImpl();
public void save(){
System.out.println("userService-->run!");
userDao.save();
}
}
业务层调用数据层时必须实例化数据层,这样增加了程序的耦合度,
Spring提供的IoC容器技术,成功帮我们解决了在代码中实例化对象的问题。
它将这些Bean统一存储起来,在需要的位置注入过去。
下面我们通过Spring框架来实现这个业务
通过IoC获取Bean对象
- 通过Maven来管理工程首先导入Spring的坐标
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.10.RELEASE</version>
</dependency>
- 我们需要创建Spring配置文件,配置对应类作为Spring管理的bean
并配置bean,在resource下建立applicationContext.xml
<!--id标签给bean起名字-->
<!--class给bean定义类型-->
<bean id="userDao" class="com.angelday.dao.UserDao"/>
<bean id="userService" class="com.angelday.service.UserService"/>
- 在测试类中我们写下如下代码
public class Test{
public static void main(){
//获取IoC容器,并且传入配置文件
ApplicationContext ctx = new ClassPatjXmlApplicationContext("applicationContext.xml");
//获取Bean,使用getBean("id");方法
UserDao userDao = (UserDao)ctx.getBean("userDao");
userDao.save();
}
}
能够看到结果说明我们成功通过IoC从Spring容器中拿出Bean,并调用了它的方法。
但是我们发现在Service中也实例化了Dao层的对象。因为需要指明Service是依赖Dao而执行的,通过DI就可以代替它。
DI解决Bean之间的耦合
UserService中依赖这行代码调用UserDao中的方法
private UserDao userDao = new UserDaoImpl();
现在我们就使用DI来代替这句实例
- 删除UserService中new对象的形式,并创建Setter方法
public class UserService{
private UserDao userDao;
public void setUserDao(UserDao userDao){
this.userDao = userDao;
}
}
- 通过配置文件来保持这两个类之间的关系
<bean id="userDao" class="com.angelday.dao.UserDao"/>
<bean id="userService" class="com.angelday.service.UserService">
<!--配置server与dao的关系-->
<property name="bookDao" ref="bookDao"/>
</bean>
<!--property标签表示配置当前bean的属性
name属性表示配置哪一个类中具体的属性
ref属性表示参照哪一个bean-->
- 在测试类中测试Service
public class Test{
public static void main(){
ApplicationContext ctx = new ClassPatjXmlApplicationContext("applicationContext.xml");
//获取Bean,使用getBean("id");方法
UserService userService = (Service)ctx.getBean("userService");
userService.save();
}
}
最后我们发现,即使在Service代码中没有实例化Dao,Spring也自动装配来一个实例化对象供我们调用。
DI注入的两种方式
- setter注入
上面的入门使用的就是Setter注入,首先在类中提供setter方法
在配置文件中用< property>标签进行赋值
注意:如果在配置简单类型的值时,不需要用ref属性,而是使用value直接指明值
- 构造器注入
删除上面的Setter方法,提供对应的构造方法
修改配置文件
<bean id="UserService" class="com.angelday.service.UserService">
<constructor-arg name="userDao" ref="userDao"/>
<!--注意:此处name是构造方法的形参名-->
</bean>
简单类型注入方法与Setter基本相同
<constructor-arg name="username" value="Angelday"/>
自动装配
IoC容器根据bean所依赖的资源在容器中自动查找并注入到bean中
自动装配的主要方式:
- 按类型 2. 按名称
属性的Setter 方法还需要保留
删除配置文件中的< property>
标签
添加autowire
属性
<bean id="userService" class="com.angelday.service.UserService" autowire="byType" />
使用此方法即可省略手动装配的步骤。