Java圈大名鼎鼎的Spring,是由Rod Johnson创建的一款以IoC和Aop著称的轻量级框架.它的诞生宣告了以EJB为传统开发模式的方案成为过去.
最近重新学习Spring,孔子曰:温故知新.希望再次学习会有不一样的收获.
IoC:所谓的控制反转,初听时有些晦涩难懂,实际上就是将Object的创建和管理交给了IoC容器.我们都知道,Java程序类与类之间没有耦合几乎是不可能的,我们程序员需要做的就是将耦合降到最低,在不影响功能的情况下,下面有一段示例可供参考.
public interface UserDao {
/**
* 测试方法 不深究方法参数返回值等
*/
void insertUser();
}
public class UserDaoImpl implements UserDao {
@Override
public void insertUser() {
System.out.println("添加用户");
}
}
public interface UserService {
/**
* 业务层方法
*/
void insertUser();
}
public class UserServiceImpl implements UserService {
@Override
public void insertUser() {
UserDao userDao = new UserDaoImpl();
userDao.insertUser();
}
}
我们知道,在三层架构中,Web->Service->Dao,业务层需要调用持久层,在没有控制反转概念之前我们在业务层中创建持久层的实现类对象,没有任何问题.但是此时如果没有Dao的实现类,那么程序编译就会报错,这种编译期依赖关系,应该在我们开发中杜绝。需要优化代码解决.
抛砖引玉,可以通过一个工厂对业务相关的类进行管理,并且提供对象输出,简言之我们不需要在类中去new Object
先创建一个properties文件bean.properties,以键值对的形式声明对象名和全限定名
userDao=com.dendi.dao.impl.UserDaoImpl
userService=com.dendi.service.impl.UserServiceImpl
然后通过工厂类去做进一步的实现
/**
* @author Dendi
*/
public class FactoryBean {
/**
* 使用map去存放对象名和对象 声明为静态字段是因为下面需要使用static块进行初始化
* String -> 对象名
* Object -> 对象
*/
private static Map<String,Object> beanMap;
static {
beanMap = new HashMap<>();
try{
//使用properties进行加载
Properties properties = new Properties();
//获取输入流
InputStream inputStream = FactoryBean.class.getClassLoader()
.getResourceAsStream("bean.properties");
properties.load(inputStream);
//拿到properties的key 枚举集合 就是properties文件中的userDao UserService
Enumeration<Object> keys = properties.keys();
//进行遍历
while (keys.hasMoreElements()){
//拿到的是key
String name = (String)keys.nextElement();
//再通过key去拿value 就是类的全限定名
String className = properties.getProperty(name);
//通过反射创建对象
Object obj = Class.forName(className).newInstance();
//存入到map集合中
beanMap.put(name,obj);
}
System.out.println("容器初始化完成");
}catch (Exception e){
e.printStackTrace();
}
}
/**
* 提供通过对象名获取对象的方法
* @param name
* @return
*/
public static Object getBean(String name){
return beanMap.get(name);
}
}
此时我们再看原先需要new实现类的地方
public class UserServiceImpl implements UserService {
// UserDao userDao = new UserDaoImpl();
private UserDao userDao = (UserDao) FactoryBean.getBean("userDao");
@Override
public void insertUser() {
userDao.insertUser();
}
}
接着进行测试
通过FactoryBean会将所有bean的管理纳入到工厂中,类和类之间减少了耦合性,当然真正的IoC容器实现绝不是我写的案例这么简单.我只是简单的描述下IoC的实现思路.
下一章将会通过xml文件去对bean进行相关的配置,真正实现IoC容器对bean的管理.
未完待续.