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>