1. 程式人生 > >Spring入門Blog[五、Spring容器組建註解@Component和Resouces實現完全註解配置]

Spring入門Blog[五、Spring容器組建註解@Component和Resouces實現完全註解配置]

@Resource和@Component實現零XML配置


1、@Resource的註解:
@Resource是J2EE的註解。意思是說在容器裡面找相應的資源。也可以通過name屬性指定它name的資源。可以註解到field或者setter上面
public class UserAction {
	private UserService userService;
	
	@Resource(name="userService")
	public void setUserService(UserService userService) {
		this.userService = userService;
	}
	public void addUser(){
		userService.HelloWorld();
	}
}


2、@Component
@Component和<context:component-scan base-package="com.spring"></context:component-scan>配合實現無XML配置,只通過註解配置及可將類放入資源容器中。

案例解析:
1、	xml檔案:配置容器資源掃描的包
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       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">
     
    <context:annotation-config/>
    <!-- 配置容器資源掃描的包 -->
   <context:component-scan base-package="com.spring"></context:component-scan>
</beans>

2、	Java檔案:
標註資源的註解@Component。括號裡面指定的是存入容器的name屬性為userService
那麼將來我們拿的時候則getBean(“userService”)即可。如果我們不指定userService它預設存入容器bean的key為userServiceImpl這樣就可以得到一個裝有UserServiceImpl物件的容器
package com.spring.service;
import org.springframework.stereotype.Component;
import com.spring.dao.UserDao;

@Component("userService")
public class UserServiceImpl implements UserService{
	private UserDao userDao;
	public void init(){
		System.out.println("init");
	}
	public void destory(){
		System.out.println("destory");
	}
	public UserDao getUserDao() {
		return userDao;
	}
	public void setUserDao(UserDao userDao) {
		this.userDao = userDao;
	}
	public void HelloWorld(){
		System.out.println("helloworld");
	}
}

通過@Resource將資源注入進來
因為上文已經配置了容器裡面的資源。所以我這裡將資源通過@Resource註解將資源注入到相關的屬性。請看程式碼:
@Component("userAction")
public class UserAction {
	private UserService userService;
	
	//它會將beans的xml檔案配置加入進去
	//也可以使用name屬性指定byName的指定
	@Resource(name="userService")
	public void setUserService(UserService userService) {
		this.userService = userService;
	}
	public void addUser(){
		userService.HelloWorld();
	}
}


測試實現:
通過上文配置的userAction案例來得到這個物件然後呼叫它裡面的方法,因為上文通過了@ Component註解將UserAction的物件配置到了容器裡面。所以獲得容器之後就可以用這種方法getbean即可

	@Test
	public void test01(){
		BeanFactory applicationContext = new ClassPathXmlApplicationContext("beans.xml");
		UserAction user = (UserAction) applicationContext.getBean("userAction");
		user.addUser();
	}


@Scope和@PostConstruct、@PreDestroy

很簡單就相當於前面講到的作用於和initmethod和destorymethod請看下面程式碼。不再多說:
@Scope("Singleton")
@Component("userService")
public class UserServiceImpl implements UserService{
	private UserDao userDao;
	@PostConstruct
	public void init(){
		System.out.println("init");
	}
	@PreDestroy
	public void destory(){
		System.out.println("destory");
	}
	public UserDao getUserDao() {
		return userDao;
	}
	public void setUserDao(UserDao userDao) {
		this.userDao = userDao;
	}
	public void HelloWorld(){
		System.out.println("helloworld");
	}
}