咱們都知道而且會使用Spring提供的依賴注入功能,只要在Spring的容器中使用<bean>標籤,指定了id和class的屬性,spring就會在咱們須要使用的使用自動的注入進程序裏面,固然這個自動注入的功能依賴了註解這個功能,不然咱們須要本身去容器中經過如下方式去手動取java
ApplicationContext ctx=new ClassPathXmlApplicationContext("applicationContext.xml"); OBJ obj=(BOJ) ctx.getBean("id");
1. @Autowiredweb
顧名思義,自動裝配,策略是根據類型進行匹配,要去符合要求的類型只有一個(多個報錯),由於根據類型就不須要根據名字,get/set方法就用不到,能夠根據我的需求選擇刪除或者保留。也不用使用<bean>的property屬性。值得注意的是若是同時配置了property和@Autowired,那麼配置文件的優先級要比註解的高,因此不要把get/set方法忘記了。spring
@Autowired註解是有屬性的,request屬性表示該對象是不是必須的,若是寫做@Autowired(request=false)就表示該對象不是必須的,Spring找不到就返回null。session
雖然寫了@Autowired可是仍是想經過名字匹配,能夠加上@Qualifier標籤mvc
@Autowired() @Qualifier("baseDao") private BaseDao baseDao;
2. @Resourceapp
public class Zoo { @Resource(name="tiger") private Tiger tiger; @Resource(type=Monkey.class) private Monkey monkey; public String toString(){ return tiger + "\n" + monkey; } }
@Resource的策略有點複雜主要包括如下幾種異步
(1)、@Resource沒有設置屬性,那麼其策略是先根據name去匹配bean,當註解寫在字段上時,name默認取字段名。spa
(2)、指定了name或者type屬性,則根據指定的去匹配。prototype
(3)、指定了name和type屬性,兩個必須都要知足,任何一個出錯都報錯。component
(4)、@Resource是J2EE的註解,而不是Spring
3. @Service
和@Controller、@Repository、@Component都類似,用來區別不一樣的mvc層,都能被Spring掃描到,通常寫在類上面,用來標註類。
@Service的做用
(1)、將被修飾的類申明爲bean,
(2)、修飾的類在bean中的id是類名的小寫
若想本身指定名字能夠寫做@Service("xxx")
3. @Scope
屬性值有prototype、request、session、global session等
@scope默認是單例模式(singleton)
@scope("prototype")
表示每次獲取Bean的時候會有一個新的實例
@scope("request")
<web-app> ... <listener> <listener-class>org.springframework.web.context.request.RequestContextListener</listener-class> </listener> ... </web-app>
@scope("session")
session做用域表示該針對每一次HTTP請求都會產生一個新的bean,同時該bean僅在當前HTTP session內有效
<context:component-scan>在xml配置了這個標籤後,spring能夠自動去掃描base-pack下面或者子包下面的java文件,若是掃描到有@Component @Controller @Service等這些註解的類,則把這些類註冊爲bean。
若是配置了<context:component-scan>那麼<context:annotation-config/>標籤就能夠不用再xml中配置了,由於前者包含了後者。
如:在base-package指明一個包
<context:component-scan base-package="cn.gacl.java"/>
代表cn.gacl.java包及其子包中,若是某個類的頭上帶有特定的註解【@Component/@Repository/@Service/@Controller】,就會將這個對象做爲Bean註冊進Spring容器。也能夠在<context:component-scan base-package=」 」/>中指定多個包,如:
<context:component-scan base-package="cn.gacl.dao.impl,cn.gacl.service.impl,cn.gacl.action"/>
@Configuration把一個類做爲一個IoC容器,它的某個方法頭上若是註冊了@Bean,就會做爲這個Spring容器中的Bean。@Scope註解 做用域@Lazy(true) 表示延遲初始化@Service用於標註業務層組件、 @Controller用於標註控制層組件(如struts中的action)@Repository用於標註數據訪問組件,即DAO組件。@Component泛指組件,當組件很差歸類的時候,咱們可使用這個註解進行標註。@Scope用於指定scope做用域的(用在類上)@PostConstruct用於指定初始化方法(用在方法上)@PreDestory用於指定銷燬方法(用在方法上)@DependsOn:定義Bean初始化及銷燬時的順序@Primary:自動裝配時當出現多個Bean候選者時,被註解爲@Primary的Bean將做爲首選者,不然將拋出異常@Autowired 默認按類型裝配,若是咱們想使用按名稱裝配,能夠結合@Qualifier註解一塊兒使用。以下:@Autowired @Qualifier("personDaoBean") 存在多個實例配合使用@Resource默認按名稱裝配,當找不到與名稱匹配的bean纔會按類型裝配。@PostConstruct 初始化註解@PreDestroy 摧毀註解 默認 單例 啓動就加載@Async異步方法調用