1. 程式人生 > >詳解註解方式的配置(09)

詳解註解方式的配置(09)

@Component的衍生註解

@Component可以標註一個類成為Spring的bean,可適用於所有的類,但是無法區分Java EE開發中三層架構的層次,所以Spring提供了三個衍生註解來區分三層架構,但是並沒有實際的意義,僅僅是語義上的區分,不過再開發中推薦使用衍生註解,因為在未來的版本中可能會增加新的特性。

  • @Controller:Web層
  • @Service:業務層
  • @Reposotory:Dao層

注入基本資料型別

使用@Value註解。

<context:component-scan base-package="com/spring/secondday" ></context
:component-scan>
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

/*
 * @Component("userDao") 等價於 <bean id="userDao" class="com.spring.secondday.UserDaoImpl"></bean>
 */
@Component("userDao")
public class UserDaoImpl implements
UserDao {
/* @Value設定值時不需要有setters方法。 */ @Value("HelloWorld") private String name; public void save() { } public String toString() { return "UserDaoImpl [name=" + name + "]"; } }
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public
class Test { public static void main(String[] args) { ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml"); UserDao ud = (UserDao)ac.getBean("userDao"); System.out.println(ud); /*Console: * UserDaoImpl [name=HelloWorld] */ } }

注入引用資料型別

  • @Autowired:使用xml的時候是按id注入,但這個註解是按型別注入。也就是說如下程式碼@Autowired \n private UserDao ud;會自動尋找UserDao的實現類來注入,如果能找到多個則會出錯。
  • @Qualifier:這個註解讓@Autowired強行使用按id注入的規則,如:@Autowired \n @Qualifier(value="userDaoMybatis") \n private UserDao ud;
  • @Resource:把@Autowired@Qualifier結合起來。如:@Resource(name="userDao") \n private UserDao ud;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

/*
 * @Component("userDao") 等價於 <bean id="userDao" class="com.spring.secondday.UserDaoImpl"></bean>
 */
@Component("userDao")
public class UserDaoImpl implements UserDao {

    /*      @Value設定值時不需要有setters方法。         */
    @Value("HelloWorld")
    private String name;
    public void save() {    }
    public String toString() {
        return "UserDaoImpl [name=" + name + "]";
    }
}
import javax.annotation.Resource;

import org.springframework.stereotype.Component;

@Component("userService")
public class UserServiceImpl implements UserService{
    @Resource(name="userDao")
    private UserDao ud;
    public void save() {    }
    public String toString() {
        return "UserServiceImpl [ud=" + ud + "]";
    }
}
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Test {
    public static void main(String[] args) {
        ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
        UserService us = (UserService)ac.getBean("userService");
        System.out.println(us);
        /*Console:
         *      UserServiceImpl [ud=UserDaoImpl [name=HelloWorld]]       */
    }
}

配置bean的生命週期

  • @PostConstruct:配置初始化時執行的方法
  • PreDestroy:配置工廠關閉時執行的方法
@PostConstruct
public void init(){
    System.out.println("init");
}
@PreDestroy
public void destory() {
    System.out.println("destory");
}

配置bean的作用域

@Scope(value="")配置bean的作用範圍,屬性值和xml方式一致。

  • singleton :預設的,Spring會採用單例模式建立這個物件。
  • prototype :多例模式。
  • request :應用在web專案中,Spring建立這個類以後,將這個類存入到request範圍中。
  • session :應用在web專案中,Spring建立這個類以後,將這個類存入到session範圍中。
  • globalsession :應用在web專案中,必須在porlet環境下使用。但是如果沒有這種環境,相當於session。