IOC称为控制反转。反转,也就是把任务交给别人,即IOC容器。关系都自己来维护,如果有很多对象,都自己来做。现在写一工厂,自己来解析文件。现在反转了,这些事你不用做了,交给IOC容器。IOC提供了相应的配置,我们可以把这种依赖关系配制上就可以了。只要把依赖关系配制好就可以了。例如:下面将要说要的,UserManager依赖于UserDaoImpl,这些所有的业务对象,关系都给配制上。那么Spring会自动地把UserDaoImpl给new好,把UserManager给new好,然后调用UserManager构造函数。把自动new好的UserDaoImpl放进去。当然,自动放进去是有前提的,你的UserManager要提供构造函数或UserManager的实现要提供set方法,即setUserDao方法,传送一个userDao过去。它就能调用你的set方法,把new好的UserDao给你,这个给的过程就称为注入,即DI,依赖注入。你主动的找一件东西,你是有依赖关系的,而现在是,它主动的给你,是没有依赖关系的。这就是IOC容器。除了DI实现,还有一种实现是依赖查找。Spring没有侵入性,主要就体现在这里。你提供标准的构造函数,标准的set方法,我就可以把对象new好,设过来。
首先,我们先建一个java项目。
项目里有三个包,如下:
1.package com.test.spring.dao
dao下有两个类,一个是接口UserDao,还有一个是UserDao的实现UserDaoImpl。
package com.test.spring.dao;
public interface UserDao {
public void save(String username, String password);
}
package com.test.spring.dao;
public class UserDaoImpl implements UserDao {
public void save(String username, String password) {
System.out.print("-----------UserDaoImpl.save()--------------");
}
}
2.package com.test.spring.manager
manager即是业务层,一个是接口UserManager,还有一个是UserManager的实现UserManagerImpl。
package com.test.spring.manager;
public interface UserManager {
public void save(String username,String password);
}
package com.test.spring.manager;
import com.test.spring.dao.UserDao;
public class UserManagerImpl implements UserManager {
private UserDao userDao; //public UserManagerImpl(UserDao userDao) {
//this.userDao = userDao;//此处用的是构造方法
//}
public void save(String username, String password) {
this.userDao.save(username, password);
}
public void setUserDao(UserDao userDao{ this.userDao=userDao; //一般都用set方法
}
3.package com.test.spring.client
client即客户端。
package com.test.spring.client;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.test.spring.dao.UserDaoImpl;
import com.test.spring.manager.UserManager;
import com.test.spring.manager.UserManagerImpl;
public class Client {
public static void main(String[] args) {
//UserManager userManager=new UserManagerImpl(new UserDaoImpl());
//userManager.save("张三", "123");
BeanFactory factory = new ClassPathXmlApplicationContext("applicationContext.xml");
UserManager userManager = (UserManager)factory.getBean("userManager");
userManager.save("张三", "123");
}
}
引入Spring依赖库里的解压好的jar包,三个即可,即:spring.jar、commons-logging.jar、log4j-1.2.14.jar
在src下面,还要建applicationContext.xml和log4j.properties,此处这两个文件可以在Spring的jar包下面直接拷贝过来即可。
applicationContext.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" xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx" xmlns:context="http://www.springframework.org/schema/context"
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/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
http://www.springframework.org/schema/tx ">http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">
<!--即处id是唯一的标识--> <bean id="userDaoImpl" class="com.test.spring.dao.UserDaoImpl" />
<bean id="userManager" class="com.test.spring.manager.UserManagerImpl">
<constructor-arg ref="userDaoImpl" />
</bean>
</beans>
log4j.properties
log4j.rootLogger=INFO, stdout,logfile log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - %m%n
log4j.appender.logfile=org.apache.log4j.RollingFileAppender
log4j.appender.logfile.file=${project.root}/WEB-INF/petstore.log Loglog4j.appender.logfile.MaxFileSize=512KB log4j.appender.logfile.MaxBackupIndex=3 log4j.appender.logfile.layout=org.apache.log4j.PatternLayout
log4j.appender.logfile.layout.ConversionPattern=%d %p [%c] - %m%n