javaspring中依赖注入原理及举例

所谓依赖注入就是指:在运行期,由外部容器动态地将依赖对象注入到组件中。当spring容器启动后,spring容器初始化,创建并管理bean对象,以及销毁它。所以我们只需从容器直接获取Bean对象就行,而不用编写一句代码来创建bean对象。这种现象就称作控制反转,即应用本身不负责依赖对象的创建及维护,依赖对象的创建及维护是由外部容器负责的。这样控制权就由应用转移到了外部容器,控制权的转移就是所谓反转。虽然平时只需要按要求将bean配置到配置文件中,但是了解其实现过程对理解spring的实现原理是有好处的,下面就是模拟spring实现依赖注入的过程。

举个例子:第一步需要先导入jar包,导入spring.jar 和commons-logging.jar 如果不加第二个jar包的话,会报错。到时候只要把commons-logging.jar导入就行。

第二步:新建一个xml的file,取名为beans.xml

beans.xml的开头的部分,参考的是spring包中的ApplicationContext.xml,将其复制粘贴,然后再修改。

主要代码为:


xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">

   

里面是要注入到所调用的对象的名称,和所在的包。

下面则开始创建一系列的包,先建一个接口,接口名称为UserDao 所在的包为com.sxt.spring.dao 

如代码所示:

package com.bjsxt.spring.dao;
public interface UserDao {
public void insert(String uname);
}

为了实现这一接口,新建一个com.sxt.spring.dao.impl的包,在包中有个类类名为UserDaoImpl

代码如下:

package com.bjsxt.spring.dao.impl;
import org.springframework.stereotype.Component;


import com.bjsxt.spring.dao.UserDao;
@Component("userDao")
 class UserDaoImpl implements UserDao{
public void insert(String uname) {
// TODO Auto-generated method stub
System.out.println("增加一个用户"+uname);
}
}

再次定义一个调用上面的UserDao的类,在建类之前,先建一个接口UserService ,代码如下:

package com.bjsxt.spring.service;
public interface UserService {
public void add(String uname);
}

然后实现这一接口;代码如下所示:

package com.bjsxt.spring.service.impl;
import javax.annotation.Resource;
import org.springframework.stereotype.Component;
import com.bjsxt.spring.dao.UserDao;
import com.bjsxt.spring.service.UserService;
@Component("userService")
 class UserServiceImpl  implements UserService{
 @Resource 
private UserDao userDao;
public UserDao getUserDao() {
return userDao;
}
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
public void add(String uname) {
// TODO Auto-generated method stub
userDao.insert(uname);
}
}

然后修改bean.xml 的代码:加入两个bean,以便注入创建对象。


其中property  name 代表的是:UserService 内部所调用的对象。  property name的名字必须和UserService 名字相同才可以。

还可以有一种方式完成依赖注入,那就是采用注解的方式,上述是采用的事xml的方式完成的依赖注入,如果采用注解的方式,bean.xml 代码,需要加入两行

代码
//扫描根包

另外还需要在调用对象需要依赖注入的位置,加上@component(“userService”) 可以见上面的红色标记在需要调用其他对象时,要在调用之间加上@resource 代表这是这个类的资源。如上图红字所示;

介绍了两种完成依赖注入的方式之后。需要对写的代码,有个测试,看是否完成了依赖注入。

测试代码如下:

package com.bjsxt.spring.test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.bjsxt.spring.service.UserService;
public class SpringTest {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
UserService userService = (UserService) context.getBean("userService");
userService.add("bbbb");
}
}

上面就是对依赖注入原理及依赖注入过程所做的总结,刚开始学spring,很多东西都有待加强,加油。



你可能感兴趣的:(java)