一、setter方法依赖注入(常用)
1.建立四个类。分别是业务实现的TestDao;业务调用的TestService;控制层TestController;测试Test;
下面分别列举四个类的代码详情,以及xml文件的配置。
1.1 创建TestDao.java类。代码如下:
写一个方法test,输出testdao
public class TestDao {
public void test(){
System.out.println("testdao");
}
}
1.2 创建TestService.java类。代码如下:
实例化TestDao对象,并调用test方法。(这里就和上一篇实例化对象的方式有些不同了。)
我们配置一下依赖注入的xml文件 applicationContext.xml。
<!-- 省略了约束文档的配置 -->
<!-- 配置TestDao的bean -->
<bean id="testDao" class="com.xuexue.model.dao.TestDao"></bean>
<!-- 配置TestService的bean -->
<bean id="testService" class="com.xuexue.model.service.TestService">
<property name="testDao" ref="testDao"></property><!--依赖注入dao-->
<!-- name是TestService类依赖的那个属性;ref配置的是,注入类的bean的id值-->
</bean>
在使用setter注入方式时,需要提供属性set方法,Spring在实例化时,会调用无参构造器,实例化之后会自动调用属性的set方法,将实例化的对象设置进去。
public class TestService {
//声明一个TestDao类型的属性,testDao就是配置文件中property标签,name属性的值
private TestDao testDao;
//写属性的set方法
public void setTestDao(TestDao testDao) {
this.testDao = testDao;
}
//写一个test方法,在里面可以直接使用testDao来调用TestDao类中的test方法了
public void test(){
testDao.test();
}
}
1.3 创建TestController.java类。代码如下: 实例化TestService对象,并调用test方法。
我们配置xml文件 applicationContext.xml。
<bean id="testController" class="com.xuexue.controllers.TestController">
<property name="testService" ref="testService"></property>
</bean>
public class TestController {
private TestService testService;
public void setTestService(TestService testService) {
this.testService = testService;
}
public void test(){
testService.test();
}
}
1.4 创建Test类。代码如下:
public class Test {
public static void main(String[] args) {
//启动spring容器
ApplicationContext context =new ClassPathXmlApplicationContext("applicationContext.xml");
TestController testController=(TestController)context.getBean("testController");
//调用方法
testController.test();
}
}
2、String、List、Set、Map的依赖注入
以Controller.java类做例子。代码如下:
public class TestController {
private TestService testService;
private String name;
private List<String> list;
private Set<String> set;
private Map<String,String> map;
private Properties p;//以key-value存储
//set方法
public void setTestService(TestService testService) {
this.testService = testService;
}
public void setName(String name) {
this.name = name;
}
public void setList(List<String> list) {
this.list = list;
}
public void setSet(Set<String> set) {
this.set = set;
}
public void setMap(Map<String, String> map) {
this.map = map;
}
public void setP(Properties p) {
this.p = p;
}
//测试方法
public void test(){
System.out.println("1.");
testService.test();
System.out.println("===================");
System.out.println("2.测试String");
System.out.println("名字:"+name);
System.out.println("===================");
System.out.println("3. 测试List");
for (String str : list) {
System.out.println(str);
}
System.out.println("===================");
System.out.println("4.测试Set");
for (String str2 : set) {
System.out.println(str2);
}
System.out.println("===================");
System.out.println("5.测试Map");
Set<Entry<String, String>> entries = map.entrySet();
for (Entry<String, String> entry : entries) {
System.out.println(entry.getKey()+"\t"+entry.getValue());
}
System.out.println("===================");
System.out.println("6.测试Properties");
Set<Entry<Object, Object>> pitems = p.entrySet();
for (Entry<Object, Object> entry : pitems) {
System.out.println(entry.getKey()+"\t"+entry.getValue());
}
}
}
xml的配置。代码如下:
<bean id="testController" class="com.xuexue.controllers.TestController">
<property name="testService" ref="testService"></property>
<!--String的配置 name是属性的值,value是赋给的值-->
<property name="name" value="啦啦"></property>
<!--List<String>的配置 name是类型,value是值-->
<property name="list" >
<list>
<value>tom</value>
<value>jack</value>
<value>lucy</value>
<value>lily</value>
</list>
</property>
<!--Set<String>的配置 name是类型,value是值-->
<property name="set">
<set>
<value>tom2</value>
<value>jack2</value>
<value>lucy2</value>
<value>lily2</value>
</set>
</property>
<!--Map<String>的配置 key是键,value是值-->
<property name="map">
<map>
<entry key="m1">
<value>tom3</value>
</entry>
<entry key="m2">
<value>jack3</value>
</entry>
<entry key="m3">
<value>lucy3</value>
</entry>
<entry key="m4">
<value>lily3</value>
</entry>
</map>
</property>
<!--Properties的配置 key是键,value是值-->
<property name="p">
<props>
<prop key="p1">tom4</prop>
<prop key="p2">jack4</prop>
<prop key="p3">lucy4</prop>
<prop key="p4">lily4</prop>
</props>
</property>
</bean>
二、构造器依赖注入(不常用)
以TestDao和TestService为例子,TestDao注入TestService。代码如下:
public class TestService {
private TestDao testDao;
public MyService(TestDao testDao){
this.testDao = testDao;
}
public void test(){
testDao.test();
}
}
xml配置文件。代码如下:
<bean id="testService" class="com.xuexue.model.service.TestService">
<constructor-arg>
<ref bean="myDao"/>
</constructor-arg>
</bean>
三、注解方式实现依赖注入
1、建立四个类。分别是业务实现的UserDao;业务调用的UserService;控制层UsertController;测试TestUser;
xml配置文件。代码如下:
<!--省略约束文档的配置-->
<context:component-scan base-package="com.xuexue.model.dao"></context:component-scan>
<context:component-scan base-package="com.xuexue.model.service"></context:component-scan>
<context:component-scan base-package="com.xuexue.controllers"></context:component-scan>
base-package的值是包名。
这样配置后,这些包就都配置好了。使用详情,代码如下:
UserDao.java类
@Repository
public class UserDao {
public void usertest(){
System.out.println("usertest");
}
}
注:1、在类的前面写上:@Repository等注解,只有写上了,才被Spring管理 2、不用写set方法了
@Component->通用组件
@Controller->控制器
@Service-> Service
@Repository -> DAO
UserService.java类
@Service
public class UserService {
@Autowired
private UserDao userDao;
public void usertest(){
userDao.usertest();
}
}
UsertController.java类
@Controller
public class UserController {
@Autowired
private UserService userService;
public void setUserService(UserService userService) {
this.userService = userService;
}
}
属性上面写上@Autowired
TestUser.java类
public class TestUser {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
UserController userController=(UserController)context.getBean("userController");
userController.usertest();
}
}
四、Spring多个配置文件的结合
在做web项目时,Spring会管理很多东西,就有很多的内容需要配置,这样都写在一个配置文件里,就会到时配置文件内容太多,不好打理。除了在开启容器时传参配置文件的数组之外,在总配置文件中引入其他xml文件也可以解决这个问题。
<beans>
<import resource="Dao.xml"/>
<import resource="Service.xml"/>
<import resource="Controller.xml"/>
</beans>
<import>标签写在<beans>标签内部,所有<bean>标签前面。