配置文件注入|java怎么实现像spring那样读取配置文件然后注入到类的属性中

A. 自动注入properties文件中的配置 符号会影响注入吗

#2:key-value一行一个。 #3:不会出现你说的问题。你用Properties的load(InputStream in)方法它会自动加载配置项,然后你用Properties的get(key)方法就可以得到配置的值。 #4:都放在一行,也不是不行,但是会被解析成key=logo.location,值是:/i…

B. java怎么实现像spring那样读取配置文件然后注入到类的属性中

用反射就可以了 spring也是基于反射的解析xml 根据类路径得到class(Class.forName) 然后根据你给的property通过getField拿到Field再实例化 再赋值

C. java中如何让spring配置文件加载完,对象注入完后,自动运行某一个类呢

在你的web.xml中配置的是个欢迎界面,你把欢迎界面加载完就自动调用你要调用的类中的方法就可以。

D. spring的注入,同时用注解和在配置文件里配置注入会有什么问题

平常我们new一个实例,这个实例的控制权是我们程序员,而控制反转是指new实例工作不由我们程序员来做而是交给spring容器来做。实例工厂的方法注入构造器注入Set注入

E. 如何调用spring配置文件手动注入的bean

1jsp页面如果想要根据id直接查询信息的话,可能会需要这样的代码2而应用类Spring框架之后如上图的NewsService里面是没有实例化过的NewsDao的,这样上面图中的方法就执行不了3那假如想要使用NewsServcie中的方法,就需要去找Spring,在Action因为设置了setter方法注入所以可以直接获得实例化好的对象,那在jsp中呢?4首先你需要有一个jar包,形如spring-web-3.2.0.M2.jar,将此包加入build Path并部署或者直接复制到WEB-INF/lib下,这是spring应用在web项目时需要用到的jar包然后在jsp页面中导入相关的工具类:<%@ page import="org.springframework.web.context.support.WebApplicationContextUtils"%><%@ page import="org.springframework.web.context.WebApplicationContext"%>5最后通过以下语句获取配置文件中相应的BeanWebApplicationContext wac = WebApplicationContextUtils.(this.getServletContext()); NewsService service = (NewsService)wac.getBean("newsService");注意getBean()方法中传入的是配置文件中的Bean的id这样就可以在页面中访问Spring的Bean了,同时也可以访问service的方法了

F. spring的配置文件注入问题

id是标识bean的,spring会根据id生成对于的类你所谓的name表示是生成的这个类有这样一个属性,name必须和你类中的 setXXX() XXX第一个字母小写相同 否则找不到就报空指针ref表示你的这个属性需要引用另外一个bean 而这个ref里面写的就是你要引用的别的bean的id ,

G. spring properties配置文件怎么注入

org.springframework.beans.factory.config.类,可以方便我们使用注解直接注入properties文件中的配置。

H. spring配置文件set注入方式总返回空指针

看看set方法是不是符合命名规范,setAge属性的首字母必须大写。用到的接口: Java代码 public interface TestInterface { public void printDemo(); } 实现接口的类: Java代码 public class TestDemo implements TestInterface { public void printDemo() { System.out.print("测试成功"); } } Set写法,测试过,正常的。<a href="https://www..com/s?wd=log4j&tn=44039180_cpr&fenlei=-gF_5y9YIZ0lQzqlpA-" target="_blank" class="-highlight">log4j</a>:WARN No appenders could be found for logger (org.springframework.context.support.)<a href="https://www..com/s?wd=log4j&tn=44039180_cpr&fenlei=-gF_5y9YIZ0lQzqlpA-" target="_blank" class="-highlight">log4j</a>:WARN Please initialize the <a href="https://www..com/s?wd=log4j&tn=44039180_cpr&fenlei=-gF_5y9YIZ0lQzqlpA-" target="_blank" class="-highlight">log4j</a> system properly.

I. spring 配置文件的bean自动注入失败的解决方法是什么

一个Spring注入问题,首先看一个普通Spring Bean,

publicclassFoo{@AutowiredBarbar;publicvoiddoSomething(){bar.doSomething();}}

Spring配置一:

<beanid="bar"class="com.test.Bar"></bean><beanid="foo"class="com.test.Foo"></bean>

单元测试:

@Testpublicvoidtest_doSomthing(){ApplicationContextctx=("applicationContext-test.xml");Foofoo=ctx.getBean(Foo.class);foo.doSomething();}

执行上述测试方法,报错

java.lang.NullPointerExceptionatcom.test.Foo.doSomething(Foo.java:15)atcom.test.FooTest.test_doSomthing(FooTest.java:13)

即foo bean中的bar并未注入。

Spring配置二:

<context:component-scanbase-package="com.test"></context:component-scan>

当改成配置二后执行上述单元测试方法便能成功通过。经分析日志及查看源代码,发现使用配置二时供装载了6个bean,如下所示:

DEBUGorg.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:216)[applicationContext-test.xml]DEBUGorg.springframework.context.support.AbstractApplicationContext.obtainFreshBeanFactory(AbstractApplicationContext.java:530)[email protected]:org.s[email protected]14cc51c8:definingbeans[bar,foo,org.springframework.context.annotation.,org.springframework.context.annotation.,org.springframework.context.annotation.,org.springframework.context.annotation.];rootoffactoryhierarchy

而使用配置一时只有两个bean,如下所示:

DEBUGorg.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:216)[applicationContext-test.xml]DEBUGorg.springframework.context.support.AbstractApplicationContext.obtainFreshBeanFactory(AbstractApplicationContext.java:530)[email protected]:org.s[email protected]18481697:definingbeans[bar,foo];rootoffactoryhierarchy

配置二执行单元测试通过的原因似乎就在于多出的这几个bean。是不是只要有context:component-scan元素在自动就会有这几个bean的产生?验证此假设

在配置一中添加一个无实际意义的context:component-scan元素,如下所示:

<context:component-scanbase-package="com.nonexist"></context:component-scan>

这时执行单元测试能通过,同配置二一样也会装载6个bean。那么这6个bean中到底哪个对注入bar到Foo中起了作用呢?

经过断点调试发现是 bean起了作用,见输出日志:

2015-04-2520:23:09DEBUGorg.springframework.beans.factory.annotation.InjectionMetadata.<init>(InjectionMetadata.java:60)Foundinjectedelementonclass[com.test.Foo]:AutowiredFieldElementforcom.test.Barcom.test.Foo.bar2015-04-2520:23:09DEBUGorg.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:85)'foo':AutowiredFieldElementforcom.test.Barcom.test.Foo.bar2015-04-2520:23:09DEBUGorg.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:245)'bar'2015-04-2520:23:09DEBUGorg.springframework.beans.factory.annotation..registerDependentBeans(.java:424)Autowiringbytypefrombeanname'foo'tobeannamed'bar'2015-04-2520:23:09DEBUGorg.springframework.beans.factory.support..createBean(.java:458)'foo'

那么直接在配置一种显式添加bean呢?如下所示:

<beanid="bar"class="com.tcl.account.service.test.Bar"></bean><beanid="foo"class="com.tcl.account.service.test.Foo"></bean><beanid=""class="org.springframework.beans.factory.annotation."></bean>

测试会不会通过?会通过。见日志:

DEBUGorg.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:216)[applicationContext-test.xml]DEBUGorg.springframework.context.support.AbstractApplicationContext.obtainFreshBeanFactory(AbstractApplicationContext.java:530)[email protected]:org.s[email protected]1924ed52:definingbeans[bar,foo,];rootoffactoryhierarchyDEBUGorg.springframework.beans.factory.annotation.InjectionMetadata.<init>(InjectionMetadata.java:60)Foundinjectedelementonclass[com.test.Foo]:AutowiredFieldElementforcom.test.Barcom.test.Foo.barDEBUGorg.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:85)'foo':AutowiredFieldElementforcom.test.Barcom.test.Foo.barDEBUGorg.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:245)'bar'DEBUGorg.springframework.beans.factory.annotation..registerDependentBeans(.java:424)Autowiringbytypefrombeanname'foo'tobeannamed'bar'DEBUGorg.springframework.beans.factory.support..createBean(.java:458)'foo'

那么为什么在配置文件中添加了context:componet-scan元素后就会自动添加那另外4个bean呢?经过断点调试发现Spring隐式装载的4个bean是在如下方法中加载的:

Set<BeanDefinitionHolder>org.springframework.context.annotation.AnnotationConfigUtils.(,Objectsource)

其调用链如下所示:

补充一:

若仍用配置一,但单元测试改成如下形式也可以测试通过。

@RunWith(SpringJUnit4ClassRunner.class)@ContextConfiguration(locations={"classpath:/applicationContext-test.xml"})publicclassFooTest2{@AutowiredprivateFoofoo;@Testpublicvoidtest_doSomthing(){foo.doSomething();}}

当然一点都不意外,这种方式也会隐式加载那4个bean,见日志:

DEBUGorg.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:216)[classpath:/applicationContext-test.xml]INFOorg.springframework.context.support.AbstractApplicationContext.prepareRefresh(AbstractApplicationContext.java:500)Refreshi[email protected]51f3336e:startupdate[SunApr2617:27:35CST2015];rootofcontexthierarchyDEBUGorg.springframework.context.support.AbstractApplicationContext.obtainFreshBeanFactory(AbstractApplicationContext.java:530)Beanfactoryf[email protected]51f3336e:org.s[email protected]4f9d1352:definingbeans[bar,foo,org.springframework.context.annotation.,org.springframework.context.annotation.,org.springframework.context.annotation.,org.springframework.context.annotation.];rootoffactoryhierarchy

补充二,若使用的是@Value,效果同@Autowired,即也需要隐式加载 bean。

publicclassFoo{@Value("${bar}")Stringbar;publicvoiddoSomething(){System.out.println(bar);}}

补充三:

若使用配置一,@PostConstruct标注的方法也不会被执行,但此时需要隐式加载的Spring bean是:org.springframework.context.annotation.

补充四:

在配置一中添加如下配置

<context:annotation-config/>

也会隐式加载那4个bean

J. 多个spring配置文件依赖注入要怎么写

主要有两种方式:

1、在一个配置文件中使用import标签导入其他配置文件,即

applicationContext.xml中部分代码如下:<importresource="applicationContext-.xml"/><importresource="applicationContext-service.xml"/><importresource="applicationContext-action.xml"/>

2、在web.xml中配置Spring配置文件处导入多个配置文件,即可

a、导入多个配置文件

web.xml部分代码如下:<context-param><param-name>contextConfigLocation</param-name><param-value>applicationContext-core.xml,applicationContext-.xml,applicationContext-service.xml,applicationContext-action.xml</param-value></context-param>

b、使用*通配符导入多个配置文件

web.xml部分代码如下:<context-param><param-name>contextConfigLocation</param-name><param-value>applicationContext-*.xml</param-value></context-param>


赞 (0)