Spring入门(一) 初识IoC

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的管理.

未完待续.

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值