junit4调试和关于spring注解方面的问题

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/ron03129596/article/details/53144365


Junit调试spring项目出现的小问题(注解方面)


今天没事把以前做过的项目拿出来看了看,想使用junit调试下看看代码返回结果,顺便回忆下之前写的代码,junit相信很多人都用过,在工作中如果一个项目很复杂使用服务器调试起来很麻烦,使用junit调试则会节约大部分时间,工欲善其事,必先利其器,所以掌握他也是很有必要的,废话不多说,下面我把操作junit出现的问题以及解决步骤贴出来。


我这里使用到的jar包为junit-4.4.jar,将下载好的jar包加入到工程中后编写一个测试类,跟着业务层代码挨着新建,使用maven进行项目管理的同学在加入依赖后,直接在对应的test包下新建测试类即可。


使用junit+spring时若未加载到相应的log4j.properties文件或者依赖则会出现如下异常(需要加入相应的properties文件和对应的jar到对应的目录下),若还需要加载其他properties文件则也需要提供,视情况而定:

log4j:WARN No appenders could be found for logger.
log4j:WARN Please initialize the log4j system properly.


Test代码头部如下:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations ={"classpath:applicationContext-configuration.xml",
		"classpath:applicationContext-security.xml"})
这里第一行是将Junit运行的环境与spring集成,第二行是因为我项目本身需要加载2个对应xml,一般情况只需要加载applicationContext.xml文件即可,classpath是指我的spring配置文件存放在src下,具体路径具体配置。


Test具体调用代码如下:

public class SearchTest {
	
	@Resource(name = "paymentService")
	private IPaymentService paymentService;
	
	@Test
	public void test(){
		paymentService.getObjById(1l);
	}
}


在调试过程中我出现了如下错误No unique bean of type [.] is defined: Unsatisfied dependency

后来仔细检查才发现,在注入service时采用了byName注入,而非byType注入,导致spring注解匹配不到Bean出现异常,后将@Autowrie和@Qualifier改为@Resource(name="service_beanname")然后输出正确。


说到这里我们重新回顾下spring几个常用注解

一、

@Service用于标注业务层代码

@Transcation用于事物处理,spring可具体配置声明事物

@Service
@Transactional
public class PaymentServiceImpl implements IPaymentService {

二、

@Autowired是将对象byType注入
@Qualifier("具体实现类")  若实现类有多个,则指向具体的实现类与@Autowired结合使用

@Resource(name="接口名") byName注入,指定具体的name

@Resource有两个属性是比较重要的,分是name和type,Spring将@Resource注解的name属性解析为bean的
名字,而type属性则解析为bean的类型。所以如果使用name属性,则使用byName的自动注入策略,而使用type属性时则使用byType自
动注入策略。如果既不指定name也不指定type属性,这时将通过反射机制使用byName自动注入策略。

@Autowired
@Qualifier("具体实现类")
private ISysLogService sysLogService;


三、

@Controller用于标注控制层组件(如struts中的action)

@Scope("prototype")常用与struts2中,意为作用域为多例,说到这具体说两句

@Scope("prototype")
@Controller
public class ActivityManageAction

在面试中很多情况下会问springmvc和struts2的区别,很多人都是模棱两可说不清,因为struts2将实体Bean与Controller放在同一个类中,而spring默认处理请求为单例,即多个请求都是对应一个同实例对象。而springmvc将bean参数化,将请求变为方法级别所以不存在属性安全问题。但struts2就不同了,他的bean是成员变量,很容易出现安全问题,所以需要配置作用域为多例(即每个请求对应一个实例)。


四、

@Repository用于标注数据访问组件,即DAO组件,大多数mybatis框架中,使用此注解将dao的接口层与mapper中的方法id直接匹配

@Component泛指组件,当组件不好归类的时候,我们可以使用这个注解进行标注,若不声明name,bean的id默认为类名首字母小写

@Aspect
@Component
public class SystemLogAdvice


以上就写到这里,个人经验,如果有不对的地方烦请朋友指出,我会尽快修改,感谢





猜你喜欢

转载自blog.csdn.net/ron03129596/article/details/53144365