spring IOC中bean标签,常用属性,注入方法
本文目录
1.Spring Bean是什么?
作为 Spring 核心机制的依赖注入,改变了传统的编程习惯,对组件的实例化不再由应用程序完成,转而交由 Spring 容器完成,在需要对象实例时注入应用程序中,从而对组件之间依赖关系进行了解耦。这一切都离不开 Spring 配置文件中使用的<bean>
元素。
Spring 容器可以被看作一个大工厂,而 Spring 容器中的Bean
就相当于该工厂的产品。如果希望这个大工厂能够生产和管理Bean
,这时则需要告诉容器需要哪些Bean
,以及需要以何种方式将这些 Bean
装配到一起。
Spring 配置文件支持两种不同的格式,分别是 XML
文件格式和 Properties
文件格式。
通常情况下,Spring 会以 XML 文件格式作为 Spring 的配置文件,这种配置方式通过 XML 文件注册并管理 Bean
之间的依赖关系。
XML 格式配置文件的根元素是 <beans>
,该元素包含了多个 <bean>
子元素,每一个<bean>
子元素定义了一个 Bean
,并描述了该 Bean
如何被装配到 Spring 容器中。
定义 Bean 的默认示例代码如下所示:
<?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">
<!-- 上面是XML的Schema约束 -->
</beans>
在<beans></beans>
标签内可以配置IOC容器需要控制的对象(还有各种外部资源)。
2.bean 标签
作用:用于配置对象让 spring 来创建的。默认情况下它调用的是类中的无参构造函数。如果没有无参构造函数则不能创建成功。
3.bean 标签的常用属性
元素的常用属性表
属性名称 | 描述 |
---|---|
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 |
4.创建bean的三种方式
还是用户保存账号的例子。
代码:
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();
}
}
bean.xml(Spring bean的配置文件)
4.1 第一种方式:使用默认构造函数创建。
在spring的配置文件中使用bean
标签,配以id和class属性之后,且没有其他属性和标签时。
采用的就是默认构造函数创建bean
对象,此时如果类中没有默认构造函数,则对象无法创建。
<?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">
<!-- 装配Java类,每个bean就是指一个Java类 -->
<!-- 第一种方法 -->
<bean id="accountService" class="com.dab.service.Impl.AccountServiceImpl"</bean>
</beans>
4.2 第二种方式: 使用普通工厂中的方法创建对象(使用某个类中的方法创建对象,并存入spring容器)
先把工厂的创建交给 spring 来管理。然后再使用工厂的 bean
来调用里面的方法。
- factory-bean 属性:用于指定实例工厂
bean
的 id。 - factory-method 属性:用于指定实例工厂中创建对象的方法。
<?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="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();
}
}
4.3 第三种方式:使用工厂中的静态方法创建对象(使用某个类中的静态方法创建对象,并存入spring容器)
使用 StaticFactory 类中的静态方法 getAccountService
创建对象,并存入 spring 容器。
- id 属性:指定
bean
的 id,用于从容器中获取 - class 属性:指定静态工厂的全限定类名
- factory-method 属性:指定生产对象的静态方法
<?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="accountService" class="com.dab.factory.StaticFactory" factory-method="getAccountService"></bean>
</beans>
工厂中的静态方法
/**
* 模拟一个工厂类(该类可能是存在于jar包中的,我们无法通过修改源码的方式来提供默认构造函数)
*/
public class StaticFactory {
public static IAccountService getAccountService(){
return new AccountServiceImpl();
}
}
运行Client:
5.小结
Spring容器通过对xml中<beans></beans>
内容进行管理,来实现对各个对象的依赖注入;
有三种注入的方法:构造函数注入、普通工厂注入、静态工厂注入。
推荐阅读
- Spring学习(1)-了解spring的各个模块.
- Spring学习(2)-程序间耦合和工厂模式解耦.
- Spring学习(3)-spring核心思想IOC(控制反转)和DI(依赖注入).
- Spring学习(4)-spring IOC中bean标签,常用属性,注入方法.
- Spring学习(5)-spring Bean的作用范围和生命周期.
- Spring学习(6)-spring简单例子.
欢迎点赞评论,指出不足,笔者由衷感谢o!