否";新";Java Spring的对象以及如何将遗留应用程序转换为;“春天”;概念
我刚刚开始学习JavaSpring以及依赖注入(DI)和控制反转(IoC)的概念 我了解到,所有对象,无论是单例、原型还是请求和会话,都是从容器中检索的 容器管理类之间的依赖关系和对象的生命周期/范围否";新";Java Spring的对象以及如何将遗留应用程序转换为;“春天”;概念,spring,legacy-code,Spring,Legacy Code,我刚刚开始学习JavaSpring以及依赖注入(DI)和控制反转(IoC)的概念 我了解到,所有对象,无论是单例、原型还是请求和会话,都是从容器中检索的 容器管理类之间的依赖关系和对象的生命周期/范围 这背后的基本思想是,对于使用Spring框架作为系统主干的应用程序,没有“新”的操作符。(如果我错了,请纠正我) 我想使没有Spring框架编码的遗留应用程序现代化,管理第三方库类,并使用Spring注入它们 我应该如何处理这个问题 我了解到,所有对象,无论是单例、原型还是请求和会话,都是从容器中
这背后的基本思想是,对于使用Spring框架作为系统主干的应用程序,没有“新”的操作符。(如果我错了,请纠正我) 我想使没有Spring框架编码的遗留应用程序现代化,管理第三方库类,并使用Spring注入它们 我应该如何处理这个问题 我了解到,所有对象,无论是单例、原型还是请求和会话,都是从容器中检索的 这是不对的。不是所有的对象,而是那些您让参与者解析的对象,都是从容器中检索的。通常,您可以使用
@组件来标记容器应该知道哪些对象。除了@Component
之外,还有其他注释在原则上也是如此,但允许更细粒度的语义,例如@Repository
,它位于@Component
的底部,并将@Target
,@Retention
,@Documented
放在顶部
容器管理类之间的依赖关系和对象的生命周期/范围
对。容器为您进行连接,即解析使用@Ressource
、@Autowired
或@Inject
注释的依赖项,具体取决于您喜欢的注释。
在生命周期期间
可能存在允许使用回调的事件。
另外:您可以确定
这背后的基本思想是,对于使用Spring框架作为系统主干的应用程序,没有“新”的操作符。(如果我错了,请纠正我)
基本原则是,将特定类型对象的创建委托给容器。对象的创建
和使用
的分离允许更大的灵活性,从而提高应用程序的可测试性
除了应用程序的“组件”之外,还有一些典型的容器,如ArrayList或HashMap,您可以像以前一样在这些容器上使用新操作符
我想使没有Spring框架编码的遗留应用程序现代化,管理第三方库类,并使用Spring注入它们
我应该如何处理这个问题
综上所述,应该是“简单的”:
1)检查每个类文件并查找其依赖项
2)重构这些组件,并将@Component
放在类的顶部
特殊情况:第三方对象,您无权访问源。然后,你必须自己将其结构封装到工厂中,例如,使用
3)通过@Autowired
添加缺少的依赖项(用于标记依赖项的spring特定注释)
4)使用@service
而不是@Component
重构服务层的组件
5)重构数据访问层,您可以使用@Repository
而不是使用@Component
这应该为您提供一个工作基础。我不知道我们如何回答这样一个模糊的问题,但您永远不应该使用new,因为您使用的是Spring的想法是不正确的。这就像说你永远不应该使用if
一样不正确,因为你使用了多态性。在有意义时使用Spring组件,对体系结构的无状态组件(控制器、服务、DAO)建模。如果您开始从Spring上下文而不是使用new来查找原型bean,则会出现问题。@JBNizet“如果您开始从Spring上下文而不是使用new来查找原型bean,则会出现问题”为什么不应该使用Spring来注入原型bean?根据我的理解,我可以使用容器查找原型bean。这里的关键是查找与注入。注射豆类是好的。这就是依赖注入的意义所在。在上下文中查找bean“因为新是邪恶的”只会无缘无故地使代码更加混乱,而依赖注入正是试图避免的。使用Spring定义一个干净的、可测试的体系结构,使用AOP处理事务等。不要使用它来避免出现新问题。@JBNizet好的,查找和注入之间有什么区别?如果我有一个Hibernate实体要在我的PageBeans(JSF)上使用,我应该使用Autowired还是new operator?Inject意味着将组件B自动连接到a中,并从a中使用B。Lookup意味着从a调用context.getBean()以获取B实例。实体应使用新的创建方法创建。如果不使用new并查找它,您会得到什么?根据定义,实体不由Spring处理。它们由Hibernate处理。“这背后的基本思想是,对于使用Spring框架作为系统主干的应用程序,没有“新”操作符。(如果我错了,请纠正我)。”您可能有@Bean方法,其中使用“新”操作符作为Java配置的一部分。但是,正如您所说的,容器管理对象并且您自己不实例化对象是很重要的。