Spring2.5註解(標註)學習筆記
想深入的學習springside,並且由於項目的需要,和在項目中深切體會到大量的<bean/>標籤的繁瑣。故學習起spring的註解。
一句話:對開發人員來說:最常用的Spring2.5最常用的註解就4個:
@Resource @Qualifier @Service @Repository
由於項目中用到的是spring 2.5,和原來的spring2.0配置多少是有點出入的。
步驟:
1.導包。
將spring.jar 和 common-logging.jar。就兩個包?對,就兩個包。對於spring2.0不推薦用的標註,如@Autowired,@Component 咱就不用了,直接用推薦的。
3.建工程。爲了測試@Repository 和@Service標籤,我按以下結構建包。
src|---entity|---User.java
|--service|--UserServiceIf.java
|--impl--|
--UserServiceImpl.java
|--dao----|--UserDaoIf.java
|--impl--|
---UserDaoImpl.java
Class:User.java
package com.fun.entity;
import org.apache.commons.lang.builder.ToStringBuilder;
public class User {
private Long id;
private String name;
private String password;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public User(){}
public String toString(){
return ToStringBuilder.reflectionToString(this);//需要加common-lang.jar
}
Class:UserServiceIf.java
package com.fun.service;
public interface UserServiceIf<User,Serializable> {
public void register(User user);
}
Class:UserServiceImpl.java
package com.fun.service.impl;
import javax.annotation.Resource;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;
import com.fun.dao.UserDao;
import com.fun.entity.User;
import com.fun.service.UserService;
@Service("userService")
public class UserServiceImpl implements UserService<User,Long> {
private UserDao<User,Long> userDao;
public void register(User user) {
userDao.save(user);
}
public UserDao<User,Long> getUserDao() {
return userDao;
}
@Resource
public void setUserDao(UserDao<User,Long> userDao) {
this.userDao = userDao;
}
}
Class:UserDaoIf.java
package com.fun.dao;
public interface UserDaoIf<User,Serializable > {
public void save(User user);
}
Class:UserDaoImpl.java
package com.fun.dao.impl;
import java.io.Serializable;
import org.springframework.stereotype.Repository;
import org.springframework.util.Assert;
import com.fun.dao.UserDao;
import com.fun.entity.User;
@Repository("userDao")
public class UserDaoImpl implements UserDao<User,Serializable> {
public void save(User user) {
Assert.notNull(user);
System.out.println(user);
if(null==user.getId()){
System.out.println("save User");
}else{
System.out.println("update User");
}
}
}
applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd"
default-lazy-init="true">
<!-- 支持標註 -->
<context:annotation-config/>
<!-- 掃描用標註的包 -->
<context:component-scan base-package="com.fun"/>
</beans>
注:這裏有個小插曲,之前一直運行沒有通過,老是報org.springframework.beans.factory.xml.XmlBeanDefinitionStoreException: Line 8 in XML document from URL [file:/E:/workspace/SpringTest-java/bin/applicationContext.xml] is invalid; nested exception is org.xml.sax.SAXParseException: cvc-complex-type.2.4.c: The matching wildcard is strict, but no declaration can be found for element 'context:annotation-config'.
後來才發現,原因是:在MyEclipse生成的XML頭中,只加了context的命名空間,忘了加Context的Location Hint 如果沒有加的話,則在 xsi:schemaLocation中沒有http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd
這兩句,從而報錯。
Class:Test.java
package com.fun.test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.fun.eg.SimpleMan;
import com.fun.entity.User;
import com.fun.service.UserService;
public class Test {
@SuppressWarnings("unchecked")
public static void main(String[] args) {
User user=new User();
user.setName("springTest");
user.setPassword("123");
ApplicationContext ac=new ClassPathXmlApplicationContext("classpath*:applicationContext.xml");
user.setId(1234L);
UserService<User, Long> us=(UserService<User,Long>)ac.getBean("userService");
us.register(user);
}
}
四,上述是可運行代碼。可以先小試牛刀一下。
五.先看看不用註解的寫法。
<bean id="userDao" class="com.fun.dao.impl.UserDaoImpl"/>
<bean id="userService" class="com.fun.service.impl.UserServiceImpl">
<property name="userDao" ref="userDao"/>
</bean>
其中:在UserDaoImpl中的@Repository(“userDao”) 等於
<bean id="userDao" class="com.fun.dao.impl.UserDaoImpl"/>
在UserServiceImpl中的@Service(“userService”)等於
<bean id="userService" class="com.fun.service.impl.UserServiceImpl"/>
在 UserServiceImpl中的@Resource等於
<property name="userDao" ref="userDao"/>
在Spring的註解中 採用了 Convertion over Configuration(約定優於配置)的方式。但是,如果在UserDaoImpl中寫成@Repository(”myUserDao”)
那麼按原來的寫法就會報BeanCreationException,因爲我們在UserServiceImpl中寫的是userDao,這時,@Qualifier就派上用場了,UserSImpl的setUserDao方法中應改寫成
@Resource
public void setUserDao(@Qualifier(“myUserDao”)UserDao<User,Long> userDao) {
this.userDao = userDao;
}
參考:
http://macrochen.javaeye.com/blog/323667
http://www.javaeye.com/topic/295348