Spring容器管理对象

今天我们就来学习一下spring的IOC思想:对象由spring来创建、管理、装配。


我们先看一下不使用Spring的情况下,怎么创建对象


新建一个java项目,结构如图:




新建一个接口类UserDao,代码:


package com.my.spring.dao;

public interface UserDao {

	public void getUser() ;
	
	
}


新建一个UserDao的mysql实现类UserDaoMySqlImpl,代码:


package com.my.spring.dao.impl;

import com.my.spring.dao.UserDao;

public class UserDaoMySqlImpl implements UserDao{

	@Override
	public void getUser() {
		System.out.println("MySql获取用户数据");
	}

}


新建一个UserDao的oracle实现类UserDaoOracleImpl,代码:


package com.my.spring.dao.impl;

import com.my.spring.dao.UserDao;

public class UserDaoOracleImpl implements UserDao{

	@Override
	public void getUser() {
		System.out.println("Oracle获取用户数据");
	}

}


新建一个接口类UserService,代码:


package com.my.spring.service;

public interface UserService {

	public void getUser() ;
	
}


新建一个UserService的实现类,代码:


package com.my.spring.service.impl;

import com.my.spring.dao.UserDao;
import com.my.spring.service.UserService;

public class UserServiceImpl implements UserService{

	private UserDao userDao = null ;
	
	public void setUserDao(UserDao userDao) {
		this.userDao = userDao;
	}
	
	@Override
	public void getUser() {
		userDao.getUser() ;
	}

}

编写测试类,代码:


package com.my.spring.test;

import com.my.spring.dao.impl.UserDaoMySqlImpl;
import com.my.spring.dao.impl.UserDaoOracleImpl;
import com.my.spring.service.impl.UserServiceImpl;

public class Test {

	public static void main(String[] args) {
		UserServiceImpl userService = new UserServiceImpl() ;
		userService.setUserDao(new UserDaoMySqlImpl()) ;
		userService.getUser() ;
		userService.setUserDao(new UserDaoOracleImpl()) ;
		userService.getUser() ;
	}
	
}


控制台打印的运行结果如图:





我们可以从测试代码中看出,当我们需要调用某一个userdao的实现类时,先创建这个userdao,然后作为参数传给userService.setUserDao()方法。



接下来我们看一下Spring是怎么做的


Spring的项目仍然是java项目,和上面一样,如图




其中UserDao、UserDaoImpl、UserService和UserServiceImpl和上面的代码一样,如图:




不同的是,Spring项目增加了Spring所需的jar包和beans.xml配置文件,


jar包可以从Spring框架中找到,具体步骤请参见《Spring入门之-------搭建步骤


beans.xml中的配置,代码如下:


<?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就是java对象 , 由spring容器创建和管理 -->
	<bean id="mysqlDao" class="com.my.spring.dao.impl.UserDaoMySqlImpl" />
	<bean id="oracleDao" class="com.my.spring.dao.impl.UserDaoOracleImpl" />
	<bean id="service" class="com.my.spring.service.impl.UserServiceImpl">
		<property name="userDao" ref="mysqlDao" />
	</bean>


</beans>


其中mysqlDao和oracleDao分别对应UserDaoMysqlImpl和UserDaoOracleImpl实现类,


service代表UserServiceImpl实现类


service中的property属性中的name对应的是UserServiceImpl中的set属性的值,如图:




对应于UserServiceImpl中的set方法,如图:




beans.xml中的property属性的使用的ref引用的是上面配置的userDaoImpl的实现,如图:






测试类Test代码变为了


package com.my.spring.test;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.my.spring.service.UserService;


public class Test {

	public static void main(String[] args) {
		ApplicationContext ac = new ClassPathXmlApplicationContext("beans.xml") ;
		UserService us = (UserService) ac.getBean("service") ;
		us.getUser() ;
	}
	
}


测试类代码的意思是:

先读取beans.xml中的配置文件,然后从中取出name是service的bean,也就是Spring帮我们创建UserService对象,然后调用getUser()方法。


运行测试类,控制台打印如下:


相关文章
相关标签/搜索