当前位置:首页 » 网页前端 » web容器加载注入对象
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

web容器加载注入对象

发布时间: 2022-05-17 22:31:51

⑴ spring在多线程中怎么注入bean

Java(多)线程中注入Spring的Bean

问题说明
今天在web应用中用到了Java多线程的技术来并发处理一些业务,但在执行时一直会报NullPointerException的错误,问题定位了一下发现是线程中的Spring bean没有被注入,bean对象的值为null。
原因分析
web容器在启动应用时,并没有提前将线程中的bean注入(在线程启动前,web容易也是无法感知的)
解决方案
方法有多种,网上也看到了不少。
1. 使用static声明变量
http://blog.csdn.net/bjamosgavin/article/details/6125497
这个方法自己试了一下但是没有成功。。。
2. 把线程设置为主程序的内部类
这也是一种简单的方法,主程序在web容器加载时肯定是可以注入Spring bean的,那么将线程的实现类放在主程序的类中便可以“共享”Spring的bean,(当然,这需要提前把线程中的需要用到的bean定义在外层的类中)。
具体操作方法,就是将生成线程的线程池定义在主程序的类中,每个线程的实现类作为内部类也定义在主程序中。这个方法自己试过,是可以的。
3. 使用静态方法直接取的容器中的spring对象
这个方法稍微专业点,可以线程的分发与线程的实现分离出来。在每个线程中使用静态方法直接取的容器中的spring对象。
使用静态方法获取容器中的spring对象可以参见
http://littie1987.iteye.com/blog/937877,
或者http://my.oschina.net/skyline520/blog/181158?p={{page}}
但一定要记住,你定义这个工具类也要配置成spring中的bean!
下面贴一下我在使用时的代码
(1)定义工具类
public class implements ApplicationContextAware {
private static ApplicationContext context;
@Override
public void setApplicationContext(ApplicationContext context) throws BeansException {
.context = context;
}

public static Object getSpringBean(String beanName) {
notEmpty(beanName, "bean name is required");
return context==null?null:context.getBean(beanName);
}
public static String[] getBeanDefinitionNames() {
return context.getBeanDefinitionNames();
}

⑵ servlet容器在启动web应用时创建哪些对象

Servlet容器 —— 以tomcat为例
在tomcat容器等级中,context容器直接管理servlet在容器中的包装类Wrapper,所以Context容器如何运行将直接影响servlet的工作方式。
tomcat容器模型如下:

一个context对应一个web工程,在tomcat的配置文件server.xml中,可以发现context的配置(在eclipse工程中,可在部署路径的conf文件夹zhoing找到)
[html] view plain在CODE上查看代码片派生到我的代码片
Context docBase="/Users/wongrobin/all/projects/tech-test/java-test/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps/base-webapp" path="/base-webapp" reloadable="true" source="org.eclipse.jst.j2ee.server:base-webapp"/>

Servlet容器的启动过程——以tomcat为例
Tomcat7增加了一个启动类:
[html] view plain在CODE上查看代码片派生到我的代码片
org.apache.catalina.startup.Tomcat

创建一个Tomcat的一个实例对象并调用start方法就可以启动tomcat。
还可以通过这个对象来增加和修改tomcat的配置参数,如可以动态增加context,servlet等。

在tomcat7中提供的example中,看是如何添加到context容器中:
[java] view plain在CODE上查看代码片派生到我的代码片
Tomcat tomcat = getTomcatInstance();
File appDir = new File(getBuildDirectory(), "webapps/examples");
tomcat.addWebapp(null, "/examples", appDir.getAbsolutePath());
tomcat.start();
ByteChunk res = getUrl("http://localhost:" + getPort() +
"/examples/servlets/servlet/HelloWorldExample");
assertTrue(res.toString().indexOf("<h1>Hello World!</h1>") > 0);

这段代码创建了一个Tomcat实例并新增了一个WEB应用,然后启动Tomcat并调用其中的一个HelloWorldExampleServlet。
Tomcat的addWebap方法的代码如下:
[java] view plain在CODE上查看代码片派生到我的代码片
public Context addWebapp(Host host, String url, String path) {
silence(url);
Context ctx = new StandardContext();
ctx.setPath( url );
ctx.setDocBase(path);
if (defaultRealm == null) {
initSimpleAuth();
}
ctx.setRealm(defaultRealm);
ctx.addLifecycleListener(new DefaultWebXmlListener());
ContextConfig ctxCfg = new ContextConfig();
ctx.addLifecycleListener(ctxCfg);
ctxCfg.setDefaultWebXml("org/apache/catalin/startup/NO_DEFAULT_XML");
if (host == null) {
getHost().addChild(ctx);
} else {
host.addChild(ctx);
}
return ctx;
}

一个WEB应用对应一个context容器,也就是servlet运行时的servlet容器。添加一个web应用时将会创建一个StandardContext容器,并且给这个context容器设置必要的参数,url和path分别代表这个应用在tomcat中的访问路径和这个应用实际的物理路径,这两个参数与tomcat配置中的两个参数是一致的。其中一个最重要的一个配置是ContextConfig,这个类会负责整个web应用配置的解析工作。
最后将这个context容器加入到父容器host中。
接下来会调用tomcat的start方法启动tomcat。
Tomcat的启动逻辑是基于观察者模式的,所有的容器都会继承Lifecycle接口,它管理着容器的整个生命周期,所有容器的修改和状态改变都会由它通知已经注册的观察者。
Tomcat启动的时序如下:

当context容器初始状态设置Init时,添加到context容器的listener将会被调用。ContextConfig继承了LifecycleListener接口,它是在调用Tomcat.addWebapp时被加入到StandardContext容器中的。ContextConfig类会负责整个WEB应用的配置文件的解析工作。
ContextConfig的init方法将会主要完成一下工作:
创建用于解析XML配置文件的contextDigester对象
读取默认的context.xml文件,如果存在则解析它
读取默认的Host配置文件,如果存在则解析它
读取默认的Context自身的配置文件,如果存在则解析它
设置Context的DocBase
ContextConfig的init方法完成后,Context容器会执行startInternal方法,这个方法包括如下几个部分:
创建读取资源文件的对象
创建ClassLoader对象
设置应用的工作目录
启动相关的辅助类,如logger,realm,resources等
修改启动状态,通知感兴趣的观察者
子容器的初始化
获取ServletContext并设置必要的参数
初始化“load on startuo”的Servlet

Web应用的初始化工作——以tomcat为例
WEB应用的初始化工作是在ContextConfig的configureStart方法中实现的,应用的初始化工作主要是解析web.xml文件,这个文件是一个WEB应用的入口。
Tomcat首先会找globalWebXml,这个文件的搜索路径是engine的工作目录下的org/apache/catalina/startup/NO-DEFAULT_XML或conf/web.xml。接着会找hostWebXml,这个文件可能会在System.getProperty("catalina.base")/conf/${EngineName}/${HostName}/web.xml.default中。接着寻找应用的配置文件examples/WEB-INF/web.xml,web.xml文件中的各个配置项将会被解析成相应的属性保存在WebXml对象中。接下来会讲WebXml对象中的属性设置到context容器中,这里包括创建servlet对象,filter,listerner等,这些在WebXml的configureContext方法中。
下面是解析servlet的代码对象:
[java] view plain在CODE上查看代码片派生到我的代码片
for (ServletDef servlet : servlets.values()) {
Wrapper wrapper = context.createWrapper();
String jspFile = servlet.getJspFile();
if (jspFile != null) {
wrapper.setJspFile(jspFile);
}
if (servlet.getLoadOnStartup() != null) {
wrapper.setLoadOnStartup(servlet.getLoadOnStartup().intValue());
}
if (servlet.getEnabled() != null) {
wrapper.setEnabled(servlet.getEnabled().booleanValue());
}
wrapper.setName(servlet.getServletName());
Map<String,String> params = servlet.getParameterMap();
for (Entry<String, String> entry : params.entrySet()) {
wrapper.addInitParameter(entry.getKey(), entry.getValue());
}
wrapper.setRunAs(servlet.getRunAs());
Set<SecurityRoleRef> roleRefs = servlet.getSecurityRoleRefs();
for (SecurityRoleRef roleRef : roleRefs) {
wrapper.addSecurityReference(roleRef.getName(), roleRef.getLink());
}
wrapper.setServletClass(servlet.getServletClass());
MultipartDef multipartdef = servlet.getMultipartDef();
if (multipartdef != null) {
if (multipartdef.getMaxFileSize() != null &&
multipartdef.getMaxRequestSize()!= null &&
multipartdef.getFileSizeThreshold() != null) {
wrapper.setMultipartConfigElement(new MultipartConfigElement(
multipartdef.getLocation(),
Long.parseLong(multipartdef.getMaxFileSize()),
Long.parseLong(multipartdef.getMaxRequestSize()),
Integer.parseInt(
multipartdef.getFileSizeThreshold())));
} else {
wrapper.setMultipartConfigElement(new MultipartConfigElement(
multipartdef.getLocation()));
}
}
if (servlet.getAsyncSupported() != null) {
wrapper.setAsyncSupported(
servlet.getAsyncSupported().booleanValue());
}
context.addChild(wrapper);
}

上面的代码将servlet容器包装成context容器中的StandardWrapper。StandardWrapper是tomcat容器中的一部分,它具有容器的特征,而Servlet作为一个独立的web开发标准,不应该强制耦合在tomcat中。
除了将Servlet包装成StandardWrapper并作为子容器添加到Context中外,其他所有的web.xml属性都被解析到Context中。

创建Servlet实例——以tomcat为例
前面完成了servlet的解析工作,并且被包装成了StandardWrapper添加到Context容器中,但是它仍然不能为我们工作,它还没有被实例化。
创建Servlet对象
如果Servlet的load-on-startup配置项大于0,那么在Context容器启动时就会被实例化。
前面提到的在解析配置文件时会读取默认的globalWebXml,在conf下的web.xml文件中定义了一些默认的配置项,其中定义了两个Servlet,分别是org.apache.catalina.servlets.DefaultServlet和org.apache.jsper.servlet.JspServelt,它们的load-on-startup分别是1和3,也就是当tomcat启动时这两个servlet就会被启动。
创建Servlet实例的方式是从Wrapper.loadServlet开始的,loadServlet方法要完成的就是获取servletClass,然后把它交给InstanceManager去创建一个基于servletClass.class的对象。如果这个Servlet配置了jsp-file,那么这个servletClass就是在conf/web.xml中定义的org.apache.jasper.servlet.JspServlet。
初始化Servlet对象
初始化Servlet在StandardWrapper的initServlet方法中,这个方法很简单,就是调用Servlet的init()方法,同时把包装了StandardWrapper对象的StandardWrapperFacade作为ServletConfig传给Servlet。
如果该Servlet关联的是一个JSP文件,那么前面初始化的就是JspServlet,接下来会模拟一次简单请求,请求调用这个JSP文件,以便编译这个JSP文件为类,并初始化这个类。
这样Servlet对象的初始化就完成了。

容器默认Servlet
每个servlet容器都有一个默认的servlet,一般都叫做default。
例如:tomcat中的 DefaultServlet 和 JspServlet (上面的部分)

⑶ 关于Spring依赖注入的问题

首先类加载和sping配置文件加载的顺序要理清楚。
1、web容器启动,开始扫描所有被指定的spring配置文件。
2、根据配置文件,实例化所有的bean对象,以java语法创建。
3、加载spring配置文件配置的对象依赖关系,将有依赖关系的bean注入到相应的对象中。
你这里报错是因为,datasource对象还没有被注入到UserDaoImpl中,而此时UserDaoImpl被实例化,datasource对象仍为空,所以报错了。

⑷ spring容器已经启动,我怎么动态的加载里面的某个bean

[引文]通常在struts2+spring的例子上,要想使用spring的Bean,可以在applicationContext.xml加上如下配置
<bean id="springBean" scope="prototype" class=""
<property name="name" value="chen"/</bean<bean id="myAction" scope="prototype" class=""
<property name="springBean" ref="springBean"/</bean如果是j2ee应用,启动web应用时将会自动加载ApplicationContext实例(Spring容器负责创建Bean实例)
一旦struts2的myAction实例化,其中的SpringBean也会被自动注入进来,从而达到使用SpringBean的目的。
[问题]但是仍有需要通过代码来调用SpringBean的情况:
1)对于不是由spring创建管理的类,如在java 代码中直接使用new去创建一个对象,并且想在这个对象中使用
SpringBean;因为这个对象并不是由Spring容器创建管理的类,所以即使它有setter方法,容器的springBean也不会被注入。
2)动态更改springBean中的属性值,如在代码运行时,name值需要发生变动;
3)对于一个独立的应用程序[解决]定义一个非Spring容器创建管理的类
public class NonSpringClass implements ServletContextAware {
private SpringBean springBean;
//如果 testGetBean不是被Spring容器创建管理,即使它有setter方法,容器的springBean也不会被注入。
public void setSpringBean(SpringBean springBean){this.springBean=springBean;}//利用ApplicationContext 从spring容器中获得springBean;
//Spring有两个核心接口BeanFactory和ApplicationContext,其中ApplicationContext是BeanFactory的子接口,
//它们代表了Spring容器,Spring容器是产生Bean的工厂,用于管理容器中的Bean。
public NonSpringClass (){//ApplicationContext acx = new ("applicationContext.xml");
ApplicationContext acx = new ("src/WEB-INF/applicationContext.xml");
springBean=(SpringBean)acx.getBean("springBean");}}调用这个类的代码:
import com.NonSpringClass;
public class TestCode {
private NonSpringClass nonSpringClass;
//这样nonSpringClass里将包含Spring容器创建的springBean}}

⑸ web开发中容器一启动就加载web.xml吗

是的,web容器一启动就会加载web.xml,从配置文件的名称就可以很明显看出来。
1 、启动一个 WEB
项目的时候, WEB 容器会去读取它的配置文件 web.xml
,读取 <listener> 和 <context-param>
两个结点。
2 、紧急着,容创建一个 ServletContext
( servlet 上下文),这个 web 项目的所有部分都将共享这个上下文。

3 、容器将 <context-param>
转换为键值对,并交给 servletContext 。

4 、容器创建 <listener>
中的类实例,创建监听器。

⑹ java web开发结合spring框架问题

1.我觉得层定义接口意义不大!
2.spring将你的注入到容器里面了,这个默认的是单例的,也就是说,每次spring都得到的是同一个对象。如果你不设置lazy的话,在web容器启动的时候,spring就会对对象初始化。
3.首先,你要在action中注入TestServiceImpl,action中需要有setTestService方法(或者注解方式)注入接口,spring通过jdk的动态代理去调用相对应的实现方法。service中同样需要注入TestDAOImpl
并在service中生存setTestDAO(或者注解方式)注入接口,然后调用接口的方法。这个与action调用service相同!

⑺ web容器怎么加载ocx

在HTML页面中使用ActiveX控件包含三个基本操作:将控件放入HTML中;将该控件下载给用户;在用户机器上安装该控件。如果只是针对IE用户,在HTML中插入ActiveX控件就比较简单;如果同时兼顾IE和Netscape用户,则要做更多工作。大家知道,HTML文件由文本和各种标志 (tags)组成,ActiveX 控件对于IE在HTML中的标志是<OBJECT>,该标记有几个重要的参数特性,它们是:

1.ID:为控件提供一个标识名称,为HTML代码提供一种访问该控件的方式。

2.CLASSID:是该控件唯一的UUID,告诉IE装入哪个对象。如果使用已经开发好的控件,它的CLASSID可以通过调用Win95或NT下的应用Regedit来查找。从开始菜单中运行该程序,展开HKEY_CLASSES_ROOT项,可以看到按字母顺序排列的注册表,找到需要使用的控件名,例如WClnt,展开时可看到一个CLSID文件夹,里面就是该控件的CLASSID。

如果是自己用VC开发控件,该UUID可以在ActiveX控件项目中的ODL(对象描述库)文件中找到;通过查看控件的类信息注释来定位特定控件的UUID,例如,要找到CMyControl控件的UUID,则需要找到以下代码:

//ClassinformationforCMyControl
[uuid(051C4748-1262-11D2-87C1-00A024D948FB),
licensed,
helpstring("CmyControlControl"),control]

uuid后面括号中的内容就是该控件的UUID。

3.CODEBASE:如果在用户机器上没有控件的当前版本,该参数告诉用户浏览器在哪里可找到要下载的控件和最新版本号.当控件作了修改后,可以更改版本号强制用户重新下载。

⑻ web容器有几种作用域如何防止sql注入

1、打开Active Directory用户和计算机>点击查看菜单>点击高级功能;2、右击你需要删除的容器>选择属性;3、打开对象选项卡,去掉防止对象被意外删除选项,点击确定;4、再右击删除即可。

⑼ web容器启动初始化完 SpringIOC 实例化完bean 项目启动完成,关于实例化问题

Class.forName("beanClassName"); 这个跟spring ioc木有关系了!因为这个是java语言反射的特性!就像男人就是阳性!如果你木有记错的话应该知道Java默认一个空构造函数!就是根据这个来反射得到bean实例!
大量的框架都是使用了这个特性才支持了动态装载一个class来完成了,对象最大化管理!但是反射消耗性能也是比较高的!
种方式是:光热转换(太阳能热水器);光电转换(太

⑽ struts2的action每次访问都重新创建一个对象,那spring的ioc是怎么实现注入的呢

在spring的配置文件中配置各个java bean 的时,可以根据实际情况配置该bean是单态bean还是多态bean,充当action的bean一般都配置成单态的,启动web服务器的时候,IOC容器加载spring配置文件,然后生成各个bean的实例,同时各个bean之间的依赖关系也已经建立了。