Spring2.5 註解學習

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
 }

 

ClassUserServiceIf.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的命名空間,忘了加ContextLocation Hint 如果沒有加的話,則在 xsi:schemaLocation中沒有http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd

這兩句,從而報錯。

ClassTest.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就派上用場了,UserSImplsetUserDao方法中應改寫成

@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

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章