最近看了一部爱情喜剧《疯岳俏佳人》,里面的“爱情科技公司”便类似于Spring容器,在小岳岳类和姗姗类之间起着控制反转(IOC)的作用。控制的什么被反转了?获取对象的方式Spring被反转了。(由小岳岳主动出击追求姗姗反转成由爱情科技公司这一Spring这一第三方容器来执行创建)。IoC是Spring框架的核心内容,使用多种方式完美的实现了IoC,可以使用XML配置,也可以使用注解,本例采用XML配置的方式,完成一个简单的IOC Demo。话不多说,先上代码。
Environment: eclipse
DAO :IUserDao.java&UserDaoImpl.java
Service:IUserBiz.java&UserBizImpl.java
Client:Client.java
applicationContext:在src目录下新建applicationContext.xml
本例代码如下:
package com.mollychin.dao;
public interface IUserDao {
public void add();
}
package com.mollychin.dao.impl;
import com.mollychin.dao.IUserDao;
public class UserDaoImpl implements IUserDao {
@Override
public void add() {
System.out.println("UserDaoImpl add()");
}
}
package com.mollychin.biz;
public interface IUserBiz {
public void add();
}
package com.mollychin.biz.impl;
import com.mollychin.biz.IUserBiz;
import com.mollychin.dao.IUserDao;
public class UserBizImpl implements IUserBiz {
private IUserDao userDao;
//set方法很重要,Spring容器注入所需
public void setUserDao(IUserDao userDao) {
this.userDao = userDao;
}
@Override
public void add() {
System.out.println("UserBizImpl add()");
userDao.add();
}
}
package com.mollychin.client;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.mollychin.biz.IUserBiz;
import com.mollychin.dao.IUserDao;
import com.mollychin.dao.impl.UserDaoImpl;
public class Client {
public static void main(String[] args) {
//构建一个应用环境上下文的工厂
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
IUserBiz userBiz = (IUserBiz)context.getBean("ub");
userBiz.add();
}
}
<?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 id="ub" class="com.mollychin.biz.impl.UserBizImpl">
<!-- userBiz内部的一个属性需要注入一个实现 -->
<property name="userDao" ref="ud" />
</bean>
<bean id="ud" class="com.mollychin.dao.impl.UserDaoImpl"/>
</beans>
将Client.java–>run as Java Application可得到结果:
现在的你对IOC有了初步的体验了吧,那么你也许会问,Spring会自动帮我们创建几次我们配置在XML文件中的对象呢?一试便知。
在Client.java加上几行代码:
package com.mollychin.client;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.mollychin.biz.IUserBiz;
import com.mollychin.dao.IUserDao;
import com.mollychin.dao.impl.UserDaoImpl;
public class Client {
public static void main(String[] args) {
//构建一个应用环境上下文的工厂
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
IUserBiz userBiz = (IUserBiz)context.getBean("ub");
userBiz.add();
IUserBiz userBiz2 = (IUserBiz)context.getBean("ub");
System.out.println(userBiz==userBiz2);//true
}
}
然后运行Client.java文件,您会发现:
哈哈,可见SpringBean的配置为单例(Singleton)
Bean的作用域可以通过Bean标签的scope属性进行设置,Bean的作用域包括:
默认情况下scope=”singleton”,那么该Bean是单例,任何人获取该Bean实例的都为同一个实例;
scope=”prototype”,任何一个实例都是新的实例;
scope=”request”,在WEB应用程序中,每一个实例的作用域都为request范围;
scope=”session”,在WEB应用程序中,每一个实例的作用域都为session范围;
下面呢,我们来使用静态工厂和非静态工厂的方式创建userDao,然后给userBiz内部的属性注入该实现。
1.非静态:
package com.mollychin.factory;
import com.mollychin.dao.IUserDao;
import com.mollychin.dao.impl.UserDaoImpl;
public class UserDaoStaticFactory {
public static IUserDao createfactory(){
return new UserDaoImpl();
}
}
在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 id="ub" class="com.mollychin.biz.impl.UserBizImpl">
<!-- userBiz内部的一个属性需要注入一个实现 -->
<property name="userDao" ref="ud3" />
</bean>
<bean id="ud" class="com.mollychin.dao.impl.UserDaoImpl" />
<!-- 实例工厂:先有工厂的实例对象,通过实例对象创建对象,提供所有的方法都是非静态的 -->
<bean id="udf" class="com.mollychin.factory.UserDaoFactory" />
<bean id="ud3" factory-bean="udf" factory-method="createUserDao" />
</beans>
package com.mollychin.factory;
import com.mollychin.dao.IUserDao;
import com.mollychin.dao.impl.UserDaoImpl;
/*
* 工厂实例的方式,即首先要有工厂对象
*/
public class UserDaoFactory {
public IUserDao createUserDao(){
return new UserDaoImpl();
}
}
2.静态
package com.mollychin.factory;
import com.mollychin.dao.IUserDao;
import com.mollychin.dao.impl.UserDaoImpl;
public class UserDaoStaticFactory {
public static IUserDao createfactory(){
return new UserDaoImpl();
}
}
<?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 id="ub" class="com.mollychin.biz.impl.UserBizImpl">
<!-- userBiz内部的一个属性需要注入一个实现 -->
<property name="userDao" ref="ud2" />
</bean>
<bean id="ud" class="com.mollychin.dao.impl.UserDaoImpl" />
<!-- 采用静态工厂的方式创建userDao -->
<bean id="ud2" class="com.mollychin.factory.UserDaoStaticFactory"
factory-method="createfactory" />
以上两种方式均可以实现IOC这一Spring核心。