小编fab*_*cca的帖子

以单例模式使用CDI

我试图在一个按照单例方法实现的类中注入一个logger对象.

代码几乎看起来像这样:

Logger 类:

public class LoggerFactory {
    @Produces 
    public Logger getLogger(InjectionPoint caller){
        return Logger.getLogger(caller.getMember().getDeclaringClass().getName());
    }
}
Run Code Online (Sandbox Code Playgroud)

然后我创建一个需要logger并实现Singleton模式的类:

public class MySingleton{
    @Inject
    private Logger logger;

    private MySingleton instance;

    /*
     * Private constructor for singleton implementation
     */
    private MySingleton(){
        logger.info("Creating one and only one instance here!");
    }

    public MySingleton getInstance(){

        if(instance == null) {
            instance = new MySingleton();
        }

        return instance;
    }
Run Code Online (Sandbox Code Playgroud)

}

如果我运行代码(在Glassfish 3.1.2.2上),我会在尝试使用记录器时立即获得NPE.我做错了什么(beans.xml档案到位)?我也尝试使用@Injectsetter方法为Logger对象,但没有运气.

java singleton dependency-injection cdi

13
推荐指数
1
解决办法
2万
查看次数

使用CDI将记录器注入Ejb

我正在努力将我认为是一项简单的任务放在一起.我有一个无状态单例Bean,我将用作我的应用程序的"加载器".bean包含在Jar(loader.jar)文件中,并驻留在我的EAR的lib文件夹中.

在EAR的根目录中有另一个jar,它包含我的应用程序将使用的无状态会话Bean的实现.

然后我创建了一个小的logger类,它实际上包含了log4j:



    import javax.annotation.PostConstruct;
    import javax.annotation.PreDestroy;
    import javax.enterprise.context.RequestScoped;
    import javax.enterprise.inject.Produces;
    import javax.enterprise.inject.spi.InjectionPoint;
    import javax.inject.Named;

    import org.apache.log4j.Logger;

    public class LoggerFactory {
        private Logger logger;

        public LoggerFactory(){
            logger = Logger.getLogger(this.getClass().getName());
        }

        @Produces Logger getLogger(InjectionPoint caller){
            return Logger.getLogger(caller.getMember().getDeclaringClass().getName());
        }
    }

Run Code Online (Sandbox Code Playgroud)

然后我把它放在一个罐子里,我把它命名为utils.jar.在这个jar中,按照CDI规范,我在META-INF文件夹中创建了一个空的beans.xml文件.utils.jar驻留在我的EAR的lib文件夹中.

现在,我之前提到的无状态Singleton Bean(加载器)

我写的就是这个



    import javax.annotation.PostConstruct;
    import javax.ejb.Singleton;
    import javax.ejb.Startup;
    import javax.inject.Inject;

    import org.apache.log4j.Logger;

    @Startup
    @Singleton
    public class Core {
        @Inject 
        private Logger logger;

        @PostConstruct
        void init(){
            logger.info("Core started");
        }
    }

Run Code Online (Sandbox Code Playgroud)

当我在glassfish 3.1.2上部署我的应用程序时,我在我的Loader bean中第一次调用logger时获得了一个简单的NPE.这让我觉得CDI调用根本没有发生,但我真诚地了解我做错了什么.

到目前为止,我的EAR结构如下:



       EAR
         |
         +---lib
         |     +--loader.jar
         |     +--utils.jar …
Run Code Online (Sandbox Code Playgroud)

ejb java-ee cdi

7
推荐指数
1
解决办法
5072
查看次数

标签 统计

cdi ×2

dependency-injection ×1

ejb ×1

java ×1

java-ee ×1

singleton ×1