平常的java开发中,程序员在某个类中需要依赖其它类的方法,则通常是new一个依赖类再调用类实例的方法,这种开发存在的问题是new的类
实例不好统一管理,spring提出了依赖注入的思想,即依赖类不由程序员实例化,而是通过spring容器帮我们new指定实例并且将实例注入到需要该
对象的类中。依赖注入的另一种说法是“控制反转”,通俗的理解是:平常我们new一个实例,这个实例的控制权是我们程序员,而控制反转是指new实例工作
不由我们程序员来做而是交给spring容器来做。
spring有多种依赖注入的形式,下面仅介绍spring通过xml进行IOC配置的方式:
这是最简单的注入方式,假设有一个SpringAction,类中需要实例化一个SpringDao对象,那么就可以定义一个private的SpringDao成员变量,然后创建SpringDao的set方法(这是ioc的注入入口):
-
package
com.bless.springdemo.action;
-
public
class
SpringAction {
-
-
private
SpringDao springDao;
-
-
public
void
setSpringDao(SpringDao springDao) {
-
this
.springDao = springDao;
-
}
-
-
public
void
ok(){
-
springDao.ok();
-
}
-
}
随后编写spring的xml文件,<bean>中的
name属性是class属性的一个别名,class属性指类的全名,因为在SpringAction中有一个公共属性Springdao,所以要
在<bean>标签中创建一个<property>标签指定SpringDao。<property>标签中的
name就是SpringAction类中的SpringDao属性名,ref指下面<bean
name="springDao"...>,这样其实是spring将SpringDaoImpl对象实例化并且调用SpringAction的setSpringDao方法将SpringDao注入
:
-
<!--配置bean,配置后该类由spring管理-->
-
<bean name="springAction"
class
=
"com.bless.springdemo.action.SpringAction"
>
-
<!--(1
)依赖注入,配置当前类中相应的属性-->
-
<property name="springDao"
ref=
"springDao"
></property>
-
</bean>
-
<bean name="springDao"
class
=
"com.bless.springdemo.dao.impl.SpringDaoImpl"
></bean>
这种方式的注入是指带有参数的构造函数注入,看下面的例子,我创建了
两个成员变量SpringDao和User,但是并未设置对象的set方法,所以就不能支持第一种注入方式,这里的注入方式是在SpringAction
的构造函数中注入,也就是说在创建SpringAction对象时要将SpringDao和User两个参数值传进来:
-
public
class
SpringAction {
-
-
private
SpringDao springDao;
-
private
User user;
-
-
public
SpringAction(SpringDao springDao,User user){
-
this
.springDao = springDao;
-
this
.user = user;
-
System.out.println("构造方法调用springDao和user"
);
-
}
-
-
public
void
save(){
-
user.setName("卡卡"
);
-
springDao.save(user);
-
}
-
}
在XML文件中同样不用<property>的形式,而是使用<constructor-arg>标签,ref属性同样指向其它<bean>标签的name属性:
-
-
<
bean
name
=
"springAction"
class
=
"com.bless.springdemo.action.SpringAction"
>
-
-
<
constructor-arg
ref
=
"springDao"
>
</
constructor-arg
>
-
<
constructor-arg
ref
=
"user"
>
</
constructor-arg
>
-
</
bean
>
-
<
bean
name
=
"springDao"
class
=
"com.bless.springdemo.dao.impl.SpringDaoImpl"
>
</
bean
>
-
<
bean
name
=
"user"
class
=
"com.bless.springdemo.vo.User"
>
</
bean
>
解决构造方法参数的不确定性,你可能会遇到构造方法传入的两参数都是同类型的,为了分清哪个该赋对应值,则需要进行一些小处理:
下面是设置index,就是参数位置:
-
<
bean
name
=
"springAction"
class
=
"com.bless.springdemo.action.SpringAction"
>
-
<
constructor-arg
index
=
"0"
ref
=
"springDao"
>
</
constructor-arg
>
-
<
constructor-arg
index
=
"1"
ref
=
"user"
>
</
constructor-arg
>
-
</
bean
>
另一种是设置参数类型:
-
<
constructor-arg
type
=
"java.lang.String"
ref
=
""
/>
静态工厂顾名思义,就是通过调用静态工厂的方法来获取自己需要的对象,为了让spring管理所有对象,我们不能直接通过"工程类.静态方法()"来获取对象,而是依然通过spring注入的形式获取:
-
package
com.bless.springdemo.factory;
-
-
import
com.bless.springdemo.dao.FactoryDao;
-
import
com.bless.springdemo.dao.impl.FactoryDaoImpl;
-
import
com.bless.springdemo.dao.impl.StaticFacotryDaoImpl;
-
-
public
class
DaoFactory {
-
-
public
static
final
FactoryDao getStaticFactoryDaoImpl(){
-
return
new
StaticFacotryDaoImpl();
-
}
-
}
同样看关键类,这里我需要注入一个FactoryDao对象,这里看起来跟第一种注入一模一样,但是看随后的xml会发现有很大差别:
-
public
class
SpringAction {
-
-
private
FactoryDao staticFactoryDao;
-
-
public
void
staticFactoryOk(){
-
staticFactoryDao.saveFactory();
-
}
-
-
public
void
setStaticFactoryDao(FactoryDao staticFactoryDao) {
-
this
.staticFactoryDao = staticFactoryDao;
-
}
-
}
Spring的IOC配置文件,注意看<bean name="staticFactoryDao">指向的class并不是FactoryDao的实现类,而是指向静态工厂DaoFactory,并且配置
factory-method="getStaticFactoryDaoImpl"指定调用哪个工厂方法
:
-
-
<
bean
name
=
"springAction"
class
=
"com.bless.springdemo.action.SpringAction"
>
-
-
<
property
name
=
"staticFactoryDao"
ref
=
"staticFactoryDao"
>
</
property
>
-
</
property
>
-
</
bean
>
-
-
<
bean
name
=
"staticFactoryDao"
class
=
"com.bless.springdemo.factory.DaoFactory"
factory-method
=
"getStaticFactoryDaoImpl"
>
</
bean
>
-
实例工厂的意思是获取对象实例的方法不是静态的,所以你需要首先new工厂类,再调用普通的实例方法:
-
public
class
DaoFactory {
-
-
public
FactoryDao getFactoryDaoImpl(){
-
return
new
FactoryDaoImpl();
-
}
-
}
那么下面这个类没什么说的,跟前面也很相似,但是我们需要通过实例工厂类创建FactoryDao对象:
-
public
class
SpringAction {
-
-
private
FactoryDao factoryDao;
-
-
public
void
factoryOk(){
-
factoryDao.saveFactory();
-
}
-
-
public
void
setFactoryDao(FactoryDao factoryDao) {
-
this
.factoryDao = factoryDao;
-
}
-
}
最后看spring配置文件:
-
-
<
bean
name
=
"springAction"
class
=
"com.bless.springdemo.action.SpringAction"
>
-
-
<
property
name
=
"factoryDao"
ref
=
"factoryDao"
>
</
property
>
-
</
bean
>
-
-
-
<
bean
name
=
"daoFactory"
class
=
"com.bless.springdemo.factory.DaoFactory"
>
</
bean
>
-
<
bean
name
=
"factoryDao"
factory-bean
=
"daoFactory"
factory-method
=
"getFactoryDaoImpl"
>
</
bean
>
Spring IOC注入方式用得最多的是(1)(2)种,多谢多练就会非常熟练。
另外注意:通过Spring创建的对象默认是单例的,如果需要创建多实例对象可以在<bean>标签后面添加一个属性:
-
<bean name=
"..."
class
=
"..."
scope=
"prototype"
>
分享到:
相关推荐
本篇主要介绍Spring中的三种注入方式,包括构造器注入、设值注入和接口注入。 **一、构造器注入** 构造器注入是通过构造函数来传递依赖对象的一种方式。当类有多个构造函数时,Spring会使用带有最多参数的构造函数...
下面我们将详细探讨Spring 中的三种注入方式:接口依赖注入(Type1)、setter/getter 注入(Type2,也称为属性注入)和构造方法注入(Type3)。 1. **接口依赖注入(Type1)** 这种注入方式相对不常见,主要适用于...
本篇主要介绍Spring中的三种注入方式,着重讲解在"Spring三种注入方式(二)"中的内容。我们将深入探讨setter注入,这是Spring中最常见的注入方式之一。 ### 一、setter注入 setter注入是通过Spring容器调用对象的...
本文将详细探讨Spring中的两种主要注入方式:构造器注入和setter注入,以及它们各自的特点和适用场景。 首先,让我们理解什么是依赖注入(Dependency Injection,简称DI)。在传统的编程模式中,一个类通常会直接...
Spring提供了多种注入方式,包括set注入、构造注入和自动注入,让我们逐一深入探讨。 1. **Set注入** Set注入是最常见的注入方式,它通过setter方法来设置对象的依赖。首先,你需要在类中声明需要注入的属性,并...
本资料“Spring中你不知道的注入方式编程开发技术共6页.pdf”深入探讨了一些不常见但实用的Spring注入方式。尽管描述中提到的文件是一个压缩包,但从其标题我们可以推测其内容可能包括以下几点: 1. **构造器注入**...
Spring框架是Java开发中广泛使用的依赖注入(Dependency Injection,简称DI)容器,它极大地提高了代码的可测试性和可维护性。...理解并掌握这些注入方式,对于高效地使用Spring框架进行开发至关重要。
Spring提供两种主要的自动注入方式:`byName`和`byType`,以及更推荐的`@Autowired`注解。 - `byName`:根据Bean的属性名查找相同名称的Bean进行注入。 - `byType`:如果Bean的属性类型只有一个匹配的Bean,那么...
Spring Boot引入了一种更智能的依赖注入方式——自动配置。自动配置是通过`@EnableAutoConfiguration`注解启动的,它根据项目中的类路径和特定条件自动配置Bean。例如,如果类路径下存在`MongoClient`的jar,Spring ...
Spring 三种依赖注入方式 Spring 框架中提供了多种依赖注入方式,其中最常用的三种依赖注入方式分别是接口注入、设值注入和构造函数注入。下面,我们将分别对这三种依赖注入方式进行详细的介绍和分析。 一、接口...
Spring 的依赖注入方式有 setter 注入、构造方法注入和接口注入。依赖注入的目标是在代码之外管理程序组建间的依赖关系。 1. Spring 注入方式有 setter 注入、构造方法注入和接口注入。其中,setter 注入和构造方法...
本文将深入探讨Spring中的依赖注入方式,包括构造器注入、设值注入和接口注入。 **一、构造器注入** 构造器注入是通过在类的构造函数中传入依赖对象来实现的。Spring容器在创建对象时,会调用带有相应依赖的构造...
本篇主要介绍Spring中的三种注入方式,包括构造器注入、设值注入和接口注入。 首先,我们来看构造器注入。构造器注入是在创建对象时,通过构造器传递依赖对象。这种方式强制了对象在创建时就必须提供所有必要的依赖...
Spring Boot 中的几种注入方法 在 Spring Boot 中,注入是一种非常重要的机制,用于将 bean 对象注入到其他 bean 对象中,以便实现松耦合和高内聚的设计目标。下面我们将对 Spring Boot 中的几种注入方法进行详细的...
要用注解注入方式,还需要在applicationContext.xml文件加入一行代码: <context:component-scan base-package="Mode"></context:component-scan> //表示在包mode下面的类将扫描带有@Component,@Controller,@Service...
本文将深入探讨Spring中的三种依赖注入方式,并结合源码分析其工作原理。 1. **构造器注入** 构造器注入是通过构造函数来传递依赖对象的。当创建一个类的新实例时,Spring容器会调用带有所需参数的构造函数,从而...
详细介绍spring的三种注入方式,带有实例和图片
Spring支持两种主要的注入方式:XML配置和注解配置。随着Java的发展,注解方式逐渐成为主流,因为它更简洁、直观。在Spring中,我们通常使用`@Autowired`、`@Qualifier`、`@Resource`等注解来进行依赖注入。 - `@...
spring注入配置文件,使用注解注入的
我们在开发过程中经常会发生spring注入错误或失败的情况,其实Web服务器端在Action、dao、service包之内是很容易实现的,在这些包之外实现spring注入就不容易了,总是出错,其实根本原因是无法获得相应的spring上...