Spring MVC框架和Spring一样为我们提供了三种依赖注入方式,分别是set注入,构造方法注入,接口注入。下面就向大家详细介绍Spring MVC依赖注入三种方式。
1.set注入采用属性的set方法进行初始化,就成为set注入。
(1)给普通字符类型赋值。public class User{
privateString username;
publicString getUsername() {
returnusername;
}
publicvoid setUsername(String username) {
this.username= username;
}
}
我们只需要提供属性的set方法,然后去属性文件中去配置好让框架能够找到applicationContext.xml文件的beans标签。标签beans中添加bean标签, 指定id,class值,id值不做要求,class值为对象所在的完整路径。bean标签再添加property 标签,要求,name值与User类中对应的属性名称一致。value值就是我们要给User类中的username属性赋的值。
<bean id="userAction"class="com.lsz.spring.action.User" >
<property name="username" value="admin"></property>
</bean>
(2)给对象赋值同样提供对象的set方法public class User{
private UserService userservice;
public UserServicegetUserservice() {
returnuser;
}
public void setUserservice(UserService userservice){
this.userservice= userservice;
}
}配置文件中要增加UserService的bean标签声明及User对象对UserService引用。
<!--对象的声明-->
<bean id="userService" class="com.lsz.spring.service.UserService"></bean>
<bean id="userAction"class="com.lsz.spring.action.User" >
<property name="userservice" ref="userService"></property>
</bean>
这样配置,框架就会将UserService对象注入到User类中。
(3)给list集合赋值同样提供set方法public class User{
privateList username;
publicList getUsername() {
returnusername;
}
publicvoid setUsername(List username) {
this.username= username;
}
}
<bean id="userAction"class="com.lsz.spring.action.User" >
<propertyname="username">
<list>
<value>zhang,san</value>
<value>lisi</value>
<value>wangwu</value>
</list>
</property>
</bean>
(4)给属性文件中的字段赋值public class User{
privateProperties props ;
publicProperties getProps() {
returnprops;
}
publicvoid setProps(Properties props) {
this.props= props;
}
}
<bean>
<propertyname="props">
<props>
<propkey="url">jdbc:oracle:thin:@localhost:orl</prop>
<propkey="driverName">oracle.jdbc.driver.OracleDriver</prop>
<propkey="username">scott</prop>
<propkey="password">tiger</prop>
</props>
</property>
</bean>
<prop>
标签中的key值是.properties属性文件中的名称注意:无论给什么赋值,配置文件中标签的name属性值一定是和对象中名称一致。
2.构造方法注入
(1)构造方法一个参数public class User{
privateString usercode;
publicUser(String usercode) {
this.usercode=usercode;
}
}
<bean id="userAction"class="com.lsz.spring.action.User">
<constructor-argvalue="admin"></constructor-arg>
</bean>
(2)构造函数有两个参数时当参数为非字符串类型时,在配置文件中需要制定类型,如果不指定类型一律按照字符串类型赋值。当参数类型不一致时,框架是按照字符串的类型进行查找的,因此需要在配置文件中制定是参数的位置
<constructor-argvalue="admin"index="0"></constructor-arg>
<constructor-argvalue="23" type="int"index="1"></constructor-arg>
这样制定,就是构造函数中,第一个参数为string类型,第二个参数为int类型
3.通过接口注入
public class ClassA {
private InterfaceB clzB;
public void doSomething() {
Ojbect obj = Class.forName(Config.BImplementation).newInstance();
clzB = (InterfaceB)obj;
clzB.doIt();
}
……
}
上面的代码中,ClassA依赖于InterfaceB的实现,如何获得InterfaceB实现类的实例?传统的方法是在代码中创建 InterfaceB实现类的实例,并将赋予clzB.这样一来,ClassA在编译期即依赖于InterfaceB的实现.为了将调用者与实现者在编译 期分离,于是有了上面的代码。
我们根据预先在配置文件中设定的实现类的类名(Config.BImplementation),动态加载实现类,并通过InterfaceB强制转型后为ClassA所用,这就是接口注入的一个最原始的雏形。
public class ClassA {
private InterfaceB clzB;
public Object doSomething(InterfaceB b) {
clzB = b;
return clzB.doIt();
}
……
}
上面代码中,加载接口实现并创建其实例的工作由容器完成。在运行期,InterfaceB实例将由容器提供。即使在IOC的概念尚未确立时,这样的方法也已经频繁出现在我们的代码中。
public class MyServlet extends HttpServlet {
public void doGet(HttpServletRequest request,HttpServletResponse response)throws ServletException, IOException {
……
}
}
HttpServletRequest和HttpServletResponse实例由Servlet Container在运行期动态注入。
上述的三种方式就是Spring MVC依赖注入方式,Spring MVC依赖注入方式和IoC反转控制本质上其实是一回事。三者相辅相成,互补互利,共同完成了Spring MVC依赖注入。想了解Spring MVC依赖注入方式的详细过程和原理可以观看本站的Spring MVC视频教程,里面有很详细的讲解,一点就透!
QCode09-04 14:38
Code大师09-04 14:50
不写代码你养我啊08-23 11:14
不写代码你养我啊09-17 18:02
要学习了06-18 18:13