关于spring的自动装配和main方法调用@resource的问题

今天在写项目的时候在一个简单的问题上卡了壳,用spring管理java项目的时候 想测试下注解是否起作用,情景在现如下:

application.config.xml的注解配置:

扫描注解所在的基本包:

 <context:component-scan base-package="com.ztja.*"></context:component-scan>

省略其他包 各种注解部分;

public class Test {
	
	public static void main(String[] args) {
		ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");//读取配置文件
		ActionText t = new ActionText();
		t.geta();
在action中代码如下:

package com.ztja.action;

import javax.annotation.Resource;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Controller;

import com.ztja.excelReaderService.ExcelReaderService;
@Component
public class ActionText {
	@Resource
	private ExcelReaderService excelReaderService ;
	
	public void geta(){
		
		excelReaderService.getinfo();
	}
	
}

其中excelReaderService是需要注入的service,

原本会以为能正确调用getinfo的方法进行输出,结果发现excelReaderService没有被注入 是null

出现问题的起初想法是,装配标签使用错了,特意把 @resource和@autowired查了一下: 

区别如下:

1、@Autowired与@Resource都可以用来装配bean. 都可以写在字段上,或写在setter方法上。 
2、@Autowired默认按类型装配(这个注解是属业spring的),默认情况下必须要求依赖对象必须存在,如果要允许null 值,可以设置它的required属性为false,如:@Autowired(required=false) 

 3、@Resource(这个注解属于J2EE的),默认安照名称进行装配,名称可以通过name属性进行指定, 
如果没有指定name属性,当注解写在字段上时,默认取字段名进行按照名称查找,如果注解写在setter方法上默认取属性名进行装配。 当找不到与名称匹配的bean时才按照类型进行装配。但是需要注意的是,如果name属性一旦指定,就只会按照名称进行装配。

虽然在代码中没有指定resource的名称,但属性名和类型都很规范,总能装配上吧,而且@resource是j2ee提供的jar 不需要另外添加,所以排除了注解使用错误的想法;

那为啥呢....各种郁闷....于是把项目关键代码copy到之前正常的程序中运行,发现依然坚挺的报错,,,

后来.....改正成以下代码

public static void main(String[] args) {
		ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
		ExcelReaderService ser = (ExcelReaderService)context.getBean("excelReaderService");
		ser.getinfo();
		
	}
然后就没问题......果然是....读取配置文件的时候的new出的context不是吃素的 ,既然new出来了 因为不是web项目,所以 必须也只能通过getBean的方式获得装配....

好吧,这也只是猜测而已.....折磨了一下午......郁闷~~~
还望高人指点一二,具体原因百度查询后未知....


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值