在POJO中注入一个Dao?

J2EE 码拜 10年前 (2015-04-05) 2207次浏览 0个评论

在ssh框架下;
有一个功能类SomeService.java  其接口为ISomeService.java

一般情况下在用的地方,定义一个属性,使用@Service 与 @Autowired就可实现属性注入,如下:

@Service
public class XXXXAction {

    @Autowired
    private ISomeService someService;

    … …
}

现在我有个问题是,可否在实体类(POJO)中注入一个SomeService对象;
User是一个实体。
类似下面的写法:
public class  User {

    @Autowired
    private ISomeService someService;

    … …
}

我想要在User的某个方法中用到someService,希望用hibernate查询出所有User对象已注入了someService;
比如:List<User>  users = XX.findByHql(“from User”);
此时,希望users中的每个对象中someService都被正确赋值,不为null

这个自动注入的功能能实现吗?有可能没有

在POJO中注入一个Dao?
标题有点写得不合适,反正不管是Dao或者是Service,都是说在POJO中注入一个功能类
在POJO中注入一个Dao?
我自己找到一个解决办法,现提交上来跟大家交流下:
首先,我想的是被注入的对象还得是从spring的容器里取,就是取spring已经初始化好的实例,所以我写了个外部函数,用来通过实例名来取实例,外部函数是这么写的:

package com.XXX.learn.control.utils;

import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Repository;
@Repository
public class SpringUtil implements ApplicationContextAware {
    private static ApplicationContext applicationContext;
    @Override
    public void setApplicationContext(ApplicationContext context) throws BeansException {
    	SpringUtil.applicationContext = context;
    }
    public static Object getBean(String name){
        return applicationContext.getBean(name);
    }
    /**
     * 成功获取到ApplicationContext对象时返回true;反之则返回false
     */
    public static Boolean isReady() {
    	return SpringUtil.applicationContext != null;
    }
}

第二步,在实体类中如此写:

public class  User {

    private ISomeService someService;

    public User() {
        System.out.println("========================>User 被创建");
        if(SpringUtil.isReady()) {
              this.someService = (ISomeService) SpringUtil.getBean("someService");
        }
    }
    
    //省略其他... ...
}

之所以要用isReady,是因为在应用启动时,在SpringUtil.applicationContext还未被注值时,调用getBean()是会出现空指针的;因此此方法的局限应该在于需在应用启动后再初始化此实体类时才能正确将指定属性注入。

在POJO中注入一个Dao?
10分
被三层架构给毒害了,,,
Spring注入dao,注入service和注入其它的类有什么区别吗??
没有的.Spring功能远比你现在这样用的强大.
在POJO中注入一个Dao?
无法归类的bean 可以使用@Component来进行注解  写在类上   替代@Service等
而 @Repository是注解在dao上的  
@Component注解接口也是spring定义出来的.
在POJO中注入一个Dao?
注册到哪里不都是一样?
在POJO中注入一个Dao?
引用 3 楼 LargeSkyMensk 的回复:

被三层架构给毒害了,,,
Spring注入dao,注入service和注入其它的类有什么区别吗??
没有的.Spring功能远比你现在这样用的强大.

我有些不明白了,我到不是说不能注入,我是想用自动注入,就是在这个类实例化时就把它的某个类属性注入值,这应该跟dao、service不一样吧,dao之类也是由spring实例化的,但bean相当于是自己new的

在POJO中注入一个Dao?
引用 4 楼 sd4000784 的回复:

无法归类的bean 可以使用@Component来进行注解  写在类上   替代@Service等
而 @Repository是注解在dao上的  
@Component注解接口也是spring定义出来的.

这样不可以吧,bean就是用来封装数据的,比如我查询得到一个User的List,这里面的n个User实例相当于是hibernate组装的(new出来的);在bean上加@Component不起作用吧

在POJO中注入一个Dao?
10分
通过加注解注入肯定是不可能的,因为hibernate的内部实现跟spring没啥关系,所以通过hibernate查询出来的对象不会自动注入。
像你那种方式肯定可以,不过奇怪的是为什么有这种奇怪的写法。同样的需求应该可以有很多种方式来实现吧。
在POJO中注入一个Dao?
充血模型 贫血模型的问题
在POJO中注入一个Dao?
在实体类中注入一个Service,可以当然可以,但是这个用法觉得很别扭。
在POJO中注入一个Dao?
引用 8 楼 dokia123 的回复:

通过加注解注入肯定是不可能的,因为hibernate的内部实现跟spring没啥关系,所以通过hibernate查询出来的对象不会自动注入。
像你那种方式肯定可以,不过奇怪的是为什么有这种奇怪的写法。同样的需求应该可以有很多种方式来实现吧。

就当前这个问题,我只想到这个做法,怎么,还有些什么办法,举个例子

在POJO中注入一个Dao?
引用 10 楼 sifinc 的回复:

在实体类中注入一个Service,可以当然可以,但是这个用法觉得很别扭。

归根到底是这个需求它就别扭,导致解决的用法也别扭


CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明在POJO中注入一个Dao?
喜欢 (0)
[1034331897@qq.com]
分享 (0)

文章评论已关闭!