在实践中理解Spring框架的依赖注入(DI)

尊重别人的劳动成果, 转载请注明文章出处http://blog.csdn.net/caib1109/article/details/51337124
本文的知识产权受到中国法律保护


假设ClassName类有方法void print();.

@Component
class ClassName {
    void print() {
        ;
    }
}

Spring框架用来自动加载类的四种注解

@Repository @Service @Controller @Component
其中, 被前三个注解注解的类对应MVC层次模型的三个层次. 最后那个是在不确定类属于MVC哪一层时用的.
在需要实例的地方调用BeanFactory.getBean("类名")就能得到类的一个实例.

class Test {
    public static void main(String[] args) {
        ClassName a = BeanFactory.getBean("ClassName");
        a.print();
    }
}

Spring从v2.5开始支持组件自动扫描, 在配置文件中添加<context: component-scan base-package="com.xxx.xxx">标签.

  • 注意: 此标签已经包含了<annotation-config>标签的功能, 即在Spring框架启动时实例化指定的base-package目录下被@Repository @Service @Controller @Component修饰的类, 并实例化被@Autowired修饰的类的fields.
  • 注意: 这四种注解产生的实例, 默认是单例模式, 即无论调用多少次BeanFactory.getBean("类名"), 都只有一个实例. 解决办法是连用@Scope("prototype")@Component修饰类.

调用BeanFactory.getBean("类名")得到实例比new也并不简单多少嘛! 别急, Spring给我们准备了更优雅的方式

@Autowired标签可以帮助我们创建类的实例, 等价于设计模式中的工厂模式.
没有Spring前, 当我们需要一个类的实例会用到

class Test {
    public static void main(String[] args) {
        ClassName a = new ClassName();
        a.print();
    }
}

有了Spring后, 我们只需要设置field变量ClassName a, 并加上@Autowired. 同时, 在配置文件中加<annotation-config>标签. 这样, Spring启动后, 我们就获得了一个ClassName的实例a. 直接用:

class Test {
    @AutoWired
    ClassName a;

    public static void main(String[] args) {
        a.print();
    }
}

尊重别人的劳动成果, 转载请注明文章出处http://blog.csdn.net/caib1109/article/details/51337124
本文的知识产权受到中国法律保护

展开阅读全文

没有更多推荐了,返回首页