今天我们就来学习一下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()方法。
运行测试类,控制台打印如下: