EJB 3.0依赖注入教程:Java注解解析

版权申诉
0 下载量 63 浏览量 更新于2024-08-06 收藏 14KB DOCX 举报
"2022年EJB 3.0开发指南之依赖注入Java教程" 在Java编程领域,依赖注入(Dependency Injection, DI)是一种重要的设计模式,它简化了对象之间的耦合,使得代码更加灵活、可测试和可维护。在EJB 3.0版本中,依赖注入成为核心特性之一,显著改善了企业级Java应用程序的开发体验。依赖注入也被称为控制反转(Inversion of Control, IOC),因为它将对象创建和依赖关系的管理从代码本身转移到外部容器。 依赖注入的主要思想是,不再由对象自己查找或创建其依赖的对象,而是由外部容器负责管理和提供这些依赖。这样,对象只需要声明它需要哪些依赖,而不需要知道如何获取它们。在EJB 3.0中,这一过程通常通过注解(Annotations)来实现,这得益于JDK 5.0引入的注解支持。 例如,如果你的应用程序需要使用一个数据源,你可以在字段或setter方法上添加`@Resource`注解,EJB容器(如JBOSS)会自动将对应的JNDI名称绑定到该字段。下面是一个简单的示例: ```java @Resource(jndiName="java:/DefaultDS") public DataSource customerDB; ``` `@Resource`注解在这里声明了一个数据源,并指定了JNDI名称。JBOSS默认配置了一个名为"java:/DefaultDS"的数据源,通过这个注解,EJB容器会自动将这个数据源注入到`customerDB`字段中,无需在代码中手动进行查找或创建。 `@Resource`注解的详细结构如下: - `name`: 指向环境属性中命名的资源,默认为空。 - `resourceType`: 指定资源类型,默认为空。 - `authenticationType`: 指定身份验证是由容器还是EJB组件进行,可以是`CONTAINER`或`APPLICATION`。 - `shareable`: 如果设置为`true`,表示资源可以被多个线程或实例共享,默认为`true`。 - `jndiName`: 指定JNDI名称,如上述示例所示。 此外,还有一个`@Resources`注解,用于在一个类级别上声明多个资源: ```java @Resources({ @Resource(name="resource1", jndiName="java:/res1"), @Resource(name="resource2", jndiName="java:/res2") }) public class MyClass { // ... } ``` `@Resources`注解允许你一次性声明和注入多个依赖,使得代码更加整洁。 依赖注入通过解耦组件间的依赖关系,提高了代码的可重用性和可测试性。在EJB 3.0中,依赖注入的引入极大地降低了开发复杂企业级应用的难度,使得开发者能够更专注于业务逻辑,而不是底层的基础设施管理。同时,由于依赖注入的灵活性,开发者可以根据需求轻松地替换或扩展依赖,这在微服务架构和云环境中的应用尤为明显。依赖注入的实践在后续的Java EE版本中得到了进一步发展,成为了现代Java开发不可或缺的一部分。

com.bes.enterprise.appserv.deployment.exception.StartupFailedException: Exception occurred while starting the application. at com.bes.enterprise.appserv.deployment.manager.AppDeployManager$2.run(AppDeployManager.java:253) at com.bes.enterprise.appserv.deployment.manager.AppDeployManager.applyDeploymentContext(AppDeployManager.java:297) at com.bes.enterprise.appserv.deployment.manager.AppDeployManager.doLoad(AppDeployManager.java:245) at com.bes.enterprise.appserv.deployment.manager.ApplicationLifecycle.load(ApplicationLifecycle.java:77) at com.bes.enterprise.appserv.deployment.AppDeployer.load(AppDeployer.java:264) at com.bes.enterprise.appserv.deployment.handler.EnableApplicationHandler.doLoad(EnableApplicationHandler.java:133) at com.bes.enterprise.appserv.deployment.handler.EnableApplicationHandler.load(EnableApplicationHandler.java:71) at com.bes.enterprise.appserv.deployment.handler.EnableApplicationHandler.doApplicationProcess(EnableApplicationHandler.java:54) at com.bes.enterprise.appserv.deployment.handler.AbstractApplicationHandler$1.call(AbstractApplicationHandler.java:69) at com.bes.enterprise.appserv.deployment.handler.AbstractApplicationHandler$1.call(AbstractApplicationHandler.java:66) at java.util.concurrent.FutureTask.run(FutureTask.java:266) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) at java.lang.Thread.run(Thread.java:750) at com.bes.enterprise.appserv.deployment.handler.AbstractApplicationHandler$TerminableThread.run(AbstractApplicationHandler.java:177) Caused by: com.bes.enterprise.ejb.BESException: Creating application failed: /besweb/webapp/prpall: ContainerBase.addChild: start: com.bes.enterprise.webtier.LifecycleException: Failed to start component [WebEngine[com.bes.appserv].VirtualHost[server].DefaultContext[/prpall]] at com.bes.enterprise.ejb.assembler.classic.assemblercontext.ApplicationDeployer.doCreateApplication(ApplicationDeployer.java:458) at com.bes.enterprise.ejb.assembler.classic.assemblercontext.ApplicationDeployer.createApplication(ApplicationDeployer.java:342) at com.bes.enterprise.ejb.assembler.classic.assemblercontext.ApplicationDeployer.createApplication(ApplicationDeployer.java:331) at com.bes.enterprise.ejb.assembler.classic.Assembler.createApplication(Assembler.java:258) at com.bes.enterprise.appserv.deployment.manager.AppDeployManager$2.run(AppDeployManager.java:251) ... 14 more Caused by: java.lang.IllegalStateException: ContainerBase.addChild: start: com.bes.enterprise.webtier.LifecycleException: Failed to start component [WebEngine[com.bes.appserv].VirtualHost[server].DefaultContext[/prpall]] at com.bes.enterprise.webtier.core.ContainerBase.addChildInternal(ContainerBase.java:745) at com.bes.enterprise.webtier.core.ContainerBase.addChild(ContainerBase.java:717) at com.bes.enterprise.webtier.core.DefaultHost.addChild(DefaultHost.java:711) at com.bes.enterprise.webext.BESWebAppBuilder.deployWebApps(BESWebAppBuilder.java:511) at com.bes.enterprise.ejb.assembler.classic.assemblercontext.ApplicationDeployer.deployWebApps(ApplicationDeployer.java:1499) at com.bes.enterprise.ejb.assembler.classic.assemblercontext.ApplicationDeployer.doCreateApplication(ApplicationDeployer.java:437) ... 18 more

2023-07-25 上传