java中的依赖_Java J2EE中的依赖查找

个人看法:设计依赖查找的设计模式,是为了解耦.

单一类型依赖查找

JNDI javax.naming.Context#lookup

JavaBeans java.beans.beancontext.BeanContext

集合类型依赖查找

java.beans.beancontext.BeanContext#getCurrentServiceSelectors

层析性依赖查找

Springboot中使用JNDI

JNDI即Java Naming and Directory Interface(JAVA命名和目录接口),那么java命名目的就是为了记录一些不方便记录的内容,就像人的名字或DNS中的域名与IP的关系。

两种模式

Springboot Embedded Tomcat(嵌入Tomcat)使用JNDI

Springboot WAR 使用JNDI

1. Springboot Embedded Tomcat(嵌入Tomcat)使用JNDI

启用默认禁用的JNDI命名。

构建一个ContextResource对象,然后添加到Context对象中

java:/comp/env/ 固定写法

JndiConfig.java

package com.rumenz;

import org.apache.catalina.Context;

import org.apache.catalina.startup.Tomcat;

import org.apache.tomcat.util.descriptor.web.ContextResource;

import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory;

import org.springframework.boot.web.embedded.tomcat.TomcatWebServer;

import org.springframework.boot.web.servlet.server.ServletWebServerFactory;

import org.springframework.context.annotation.Bean;

import org.springframework.jndi.JndiObjectFactoryBean;

import org.springframework.stereotype.Component;

import javax.naming.NamingException;

import javax.sql.DataSource;

@Component

public class JndiConfig {

@Bean

public ServletWebServerFactory servletContainer() {

TomcatServletWebServerFactory tomcatServletWebServerFactory = new TomcatServletWebServerFactory() {

@Override

protected TomcatWebServer getTomcatWebServer(Tomcat tomcat) {

tomcat.enableNaming(); //启用默认禁用的JNDI命名

return super.getTomcatWebServer(tomcat);

}

//数据库配置信息可以配置在文件中,数据库发生变动,只需修改配置文件,而不用修改代码.

@Override

protected void postProcessContext(Context context) {

ContextResource resource = new ContextResource();

resource.setName("jdbcMydb");

resource.setType(DataSource.class.getName());

resource.setProperty("driverClassName", "com.mysql.jdbc.Driver");

resource.setProperty("url", "jdbc:mysql://127.0.0.1:3306/test");

resource.setProperty("username", "root");

resource.setProperty("password","root1234");

context.getNamingResources().addResource(resource);

}

};

return tomcatServletWebServerFactory;

}

@Bean

public DataSource jndiDataSource() throws IllegalArgumentException,

NamingException {

JndiObjectFactoryBean bean = new JndiObjectFactoryBean(); // create JNDI data source

bean.setJndiName("java:/comp/env/jdbcMydb"); // jndiDataSource is name of JNDI data source

bean.setProxyInterface(DataSource.class);

bean.setLookupOnStartup(true);

bean.afterPropertiesSet();

return (DataSource) bean.getObject();

}

}

MysqlTest.java

package com.rumenz;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.boot.ApplicationArguments;

import org.springframework.boot.ApplicationRunner;

import org.springframework.boot.CommandLineRunner;

import org.springframework.context.ApplicationContext;

import org.springframework.stereotype.Component;

import javax.naming.Context;

import javax.naming.InitialContext;

import javax.naming.NamingException;

import javax.sql.DataSource;

import java.sql.Connection;

import java.sql.ResultSet;

import java.sql.Statement;

@Component

public class MysqlTest implements ApplicationRunner {

public static DataSource dataSource = null;

static {

Context context = null;

try {

context = new InitialContext();

} catch (NamingException e) {

e.printStackTrace();

}

//根据资源名称搜索

try {

dataSource = (DataSource)context.lookup("java:/comp/env/jdbcMydb");

} catch (NamingException e) {

e.printStackTrace();

}

System.out.println("static-----");

}

public void run(ApplicationArguments args) throws Exception {

System.out.println("run---------");

Statement stmt = null;

try {

Connection conn = dataSource.getConnection();

//查询

stmt = conn.createStatement();

String sql = "SELECT id,name FROM qq limit 1";

ResultSet rs = stmt.executeQuery(sql);

while(rs.next()){

int id = rs.getInt("id");

String name = rs.getString("name");

System.out.print("id: " + id);

System.out.println(", name: " + name);

}

rs.close();

stmt.close();

conn.close();

} catch (Exception e) {

e.printStackTrace();

}

}

}

2.Springboot WAR 使用JNDI

打包成war包放到tomcat,需要修改tomcat/conf/context.xml和tomcat/conf/server.xml

tomcat/conf/context.xml

global="jdbcMydb"

auth="Container"

type="javax.sql.DataSource" />

tomcat/conf/server.xml

global="jdbcMydb"

auth="Container"

type="javax.sql.DataSource"

driverClassName="com.mysql.jdbc.Driver"

url="jdbc:mysql://localhost:3306/test"

username="root"

password="root1234"

maxActive="100"

maxIdle="20"

minIdle="5"

maxWait="10000"/>

业务代码

JNDIController.java

package com.rumenz.controller;

import java.sql.Connection;

import java.sql.ResultSet;

import java.sql.SQLException;

import java.sql.Statement;

import javax.sql.DataSource;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.web.bind.annotation.GetMapping;

import org.springframework.web.bind.annotation.RestController;

@RestController

public class JNDIController {

@Autowired

private DataSource dataSource;

@GetMapping("/test")

public String test() {

try {

Connection conn = dataSource.getConnection();

Statement stmt = conn.createStatement();

String sql = "SELECT id,name FROM qq limit 1";

ResultSet rs = stmt.executeQuery(sql);

while(rs.next()){

int id = rs.getInt("id");

String name = rs.getString("name");

System.out.print("id: " + id);

System.out.println(", name: " + name);

}

rs.close();

stmt.close();

conn.close();

} catch (SQLException e) {

e.printStackTrace();

}

return null;

}

}

java.beans.beancontext.BeanContext(单一类型依赖查找/集合类型依赖查找)

单一类型依赖查找

java.beans.beancontext.BeanContextServicesSupport#getService

集合类型依赖查找

java.beans.beancontext.BeanContextServicesSupport#getCurrentServiceSelectors

层析性依赖查找

多个BeanContext相互为父子关系. 一个service的依赖有可能在多个BeanContext

32799e9cefcad24494abb49dc028d580.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值