@Component
一、注解分類
1、@controller: controller控制器層(注入服務)
2、@service : service服務層(注入dao)
3、@repository : dao持久層(實現dao訪問)
4、@component: 標注一個類為Spring容器的Bean,(把普通pojo實例化到spring容器中,相當于配置文件中的<bean id="" class=""/>)
二、@Component 注解含義
@Component: 標注Spring管理的Bean,使用@Component注解在一個類上,表示將此類標記為Spring容器中的一個Bean。

三、基于@Component擴展的注解
@Repository:
@Repository本身是基于@Component注解的擴展,被@Repository注解的POJO類表示DAO層實現,從而見到該注解就想到DAO層實現,使用方式和@Component相同;

@Service:
@Service本身是基于@Component注解的擴展,被@Service注解的POJO類表示Service層實現,從而見到該注解就想到Service層實現,使用方式和@Component相同;

@Controller:
@Controller本身是基于@Component注解的擴展,被@Controller注解的類表示Web層實現,從而見到該注解就想到Web層實現,使用方式和@Component相同;

Tips: 使用@Component,@Service,@Controller,@Repository注解的類,表示把這些類納入到spring容器中進行管理,同時也是表明把該類標記為Spring容器中的一個Bean。
四、component的掃描組件
下面寫這行配置是引入component的掃描組件
<context:component-scan base-package=”com.mmnc”>
其中base-package為指定需要掃描的包(含所有子包) ,掃描被@Service、@Controller、@Repository、@Component等注解標注的Java類,將其掃描注入到Spring容器,注入成Bean:
@Service用于標注業務層組件
@Controller用于標注控制層組件(如struts中的action)
@Repository用于標注數據訪問組件,即DAO組件.
@Component泛指組件,當組件不好歸類的時候,我們可以使用這個注解進行標注,標識為一個Bean。
五、方法初始化和銷毀
從Java EE5規范開始,Servlet增加了兩個影響Servlet生命周期的注解: @PostConstruct和@PreConstruct ,這兩個注解被用來修飾一個非靜態的void()方法,而且這個方法不能有拋出異常聲明,標注方法的初始化和銷毀,當你需要在系統啟動時提前設置一下變量或者設置值操作時,可以使用@PostConstruct注解進行項目啟動時設置來完成,當你需要處理關閉資源或者發送通知相關操作時可以使用@PreConstruct 完成。
1. @PostConstruct注解
被@PostConstruct修飾的方法會在服務器加載Servlet的時候運行,并且只會被服務器調用一次,類似于Servlet的inti()方法。被@PostConstruct修飾的方法會在構造函數之后,init()方法之前運行。
2. @PreDestroy注解
被@PreDestroy修飾的方法會在服務器卸載Servlet的時候運行,并且只會被服務器調用一次,類似于Servlet的destroy()方法。被@PreDestroy修飾的方法會在destroy()方法之后運行,在Servlet被徹底卸載之前。
加載順序如圖:

在Spring中可以使用以下方式指定初始化方法和銷毀方法(方法名任意):
//對象創建并賦值之后調用
@PostConstruct
public void init() {
System.out.println("對象創建并賦值之后調用...");
}
和
//容器移除對象之前
@PreDestroy
public void detory(){
System.out.println("容器移除對象之前執行...");
}
3. 示例
@Controller
@Lazy(false)
public class ServletInit {
@Autowired
private PCASigninServlet pcaSigninServlet;
@Autowired
private PCASignoutServlet pcaSignoutServlet;
@Autowired
private PCAInitServlet pcaInitServlet;
@Autowired
private PCALogoutServlet pcaLogoutServlet;
@Autowired
private PCAInfoServlet pcaInfoServlet;
@Autowired
private HelloServlet helloServlet;
@Autowired @Qualifier("handler")
private WebAppContext webapp;
@PostConstruct
void init(){
Server server = new Server(8848);
ServletContextHandler contextHander = new ServletContextHandler(ServletContextHandler.SESSIONS);
contextHander.setContextPath("/");
System.out.println("start init");
HandlerCollection hc =new HandlerCollection();
hc.setHandlers(new Handler[]{webapp, contextHander});
server.setHandler(hc);
System.out.println("addServlet /hello");
contextHander.addServlet(new ServletHolder(helloServlet), "/hello");
contextHander.addServlet(new ServletHolder( pcaSigninServlet), "/pca/signin");
contextHander.addServlet(new ServletHolder( pcaSignoutServlet), "/pca/signout");
contextHander.addServlet(new ServletHolder( pcaInitServlet), "/pca/init");
contextHander.addServlet(new ServletHolder( pcaLogoutServlet), "/pca/logout");
contextHander.addServlet(new ServletHolder( pcaInfoServlet), "/pca/info");
try
{
System.out.println("server start");
server.start();
server.join();
System.out.println("server stop");
} catch (Exception e)
{
e.printStackTrace();
}
}
}