作为 Spring 核心机制的依赖注入,改变了传统的编程习惯,对组件的实例化不再由应用程序完成,转而交由 Spring 容器完成,在需要对象实例时注入应用程序中,从而对组件之间依赖关系进行了解耦。这一切都离不开 Spring 配置文件中使用的
元素。
Spring 容器可以被看作一个大工厂,而 Spring 容器中的Bean
就相当于该工厂的产品。如果希望这个大工厂能够生产和管理Bean
,这时则需要告诉容器需要哪些Bean
,以及需要以何种方式将这些 Bean
装配到一起。
Spring 配置文件支持两种不同的格式,分别是 XML
文件格式和 Properties
文件格式。
通常情况下,Spring 会以 XML 文件格式作为 Spring 的配置文件,这种配置方式通过 XML 文件注册并管理 Bean
之间的依赖关系。
XML 格式配置文件的根元素是
,该元素包含了多个
子元素,每一个
子元素定义了一个 Bean
,并描述了该 Bean
如何被装配到 Spring 容器中。
定义 Bean 的默认示例代码如下所示:
<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>
在
标签内可以配置IOC容器需要控制的对象(还有各种外部资源)。
作用:用于配置对象让 spring 来创建的。默认情况下它调用的是类中的无参构造函数。如果没有无参构造函数则不能创建成功。
元素的常用属性表
属性名称 | 描述 |
---|---|
id | 给对象在容器中提供一个唯一标识。用于获取对象。 |
name | Spring 容器同样可以通过此属性对容器中的 Bean 进行配置和管理,name 属性中可以为 Bean 指定多个名称,每个名称之间用逗号或分号隔开 |
class | 指定类的全限定类名。用于反射创建对象。默认情况下调用无参构造函数。 |
scope | 指定对象的作用范围,其属性值有 singleton(单例)、prototype(原型)、request、session 和 global Session。其默认值是 singleton |
constructor-arg | 元素的子元素,可以使用此元素传入构造参数进行实例化。该元素的 index 属性指定构造参数的序号(从 0 开始),type 属性指定构造参数的类型 |
property | 元素的子元素,用于调用 Bean 实例中的 Set 方法完成属性赋值,从而完成依赖注入。该元素的 name 属性指定 Bean 实例中的相应属性名 |
ref | 和 等元素的子元素,该元素中的 bean 属性用于指定对 Bean 工厂中某个 Bean 实例的引用 |
value | 和 等元素的子元素,用于直接指定一个常量值 |
list | 用于封装 List 或数组类型的依赖注入 |
set | 用于封装 Set 类型属性的依赖注入 |
map | 用于封装 Map 类型属性的依赖注入 |
entry | 元素的子元素,用于设置一个键值对。其 key 属性指定字符串类型的键值,ref 或 value 子元素指定其值 |
还是用户保存账号的例子。
代码:
sevice业务层:
/**
* 账户业务层的接口
*/
public interface IAccountService {
void saveAccount();
}
/**
* 账户的业务层实现类
*/
public class AccountServiceImpl implements IAccountService {
public AccountServiceImpl(){
System.out.println("对象创建了");
}
public void saveAccount() {
System.out.println("service中的saveAccount方法执行了。。。。");
}
public void init(){
System.out.println("对象初始化了。。。");
}
public void destroy(){
System.out.println("对象销毁了。。。");
}
}
Dao持久层
/**
* 账户的持久层接口
*/
public interface IAccountDao {
/**
* 模拟保存账户
*/
void saveAccount();
}
/**
* 账户的持久层实现类
*/
public class AccountDaoImpl implements IAccountDao {
public void saveAccount() {
System.out.println("保存了账户.");
}
}
模拟表现层
/**
* 模拟一个表现层,用于调用业务层
*/
public class Client {
public static void main(String[] args) {
//1.使用 ApplicationContext 接口,获取spring核心容器对象
ApplicationContext ac = new ClassPathXmlApplicationContext("bean.xml");
//2.根据id获取Bean对象
IAccountService as = (IAccountService)ac.getBean("accountService");
System.out.println(as);
as.saveAccount();
}
}
在spring的配置文件中使用bean
标签,配以id和class属性之后,且没有其他属性和标签时。
采用的就是默认构造函数创建bean
对象,此时如果类中没有默认构造函数,则对象无法创建。
<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>
beans>
先把工厂的创建交给 spring 来管理。然后再使用工厂的 bean
来调用里面的方法。
bean
的 id。
<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="instanceFactory" class="com.dab.factory.InstanceFactory">bean>
<bean id="accountService" factory-bean="instanceFactory" factory-method="getAccountService">bean>
beans>
/**
* 模拟一个实例工厂类(该类可能是存在于jar包中的,我们无法通过修改源码的方式来提高构造函数)
* 创建业务层实现类
* 此工厂创建对象,必须先有工厂实例对象,再调用方法
*/
public class InstanceFactory {
public IAccountService getAccountService(){
return new AccountServiceImpl();
}
}
使用 StaticFactory 类中的静态方法 getAccountService
创建对象,并存入 spring 容器。
bean
的 id,用于从容器中获取
<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="accountService" class="com.dab.factory.StaticFactory" factory-method="getAccountService">bean>
beans>
/**
* 模拟一个工厂类(该类可能是存在于jar包中的,我们无法通过修改源码的方式来提供默认构造函数)
*/
public class StaticFactory {
public static IAccountService getAccountService(){
return new AccountServiceImpl();
}
}
Spring容器通过对xml中
内容进行管理,来实现对各个对象的依赖注入;
有三种注入的方法:构造函数注入、普通工厂注入、静态工厂注入。
推荐阅读
欢迎点赞评论,指出不足,笔者由衷感谢o!