注解:代碼中的特殊標記,注解可以使用在類、方法、屬性上面,使用注解可實現一些基本的功能。注解的寫法是@注解名稱(屬性=屬性值)
。
使用注解創建對象
第一步,創建Web項目,引入Spring的開發包
第二步,編寫相關的類
在src目錄下創建一個cn.itcast.anno包,並在該包下編寫一個User類。
public class User { public void add() { System.out.println("add...................."); } }
第三步,創建Spring配置文件
- 在Spring配置文件中引入約束,如下:
<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.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
- 在Spring配置文件中做些事情,即開啟注解掃描。
<!-- 開啟注解的掃描。到配置的包里面掃描類、方法、屬性上面是否有注解 --> <context:component-scan base-package="cn.itcast"></context:component-scan>
注意:也可以這樣開啟注解掃描,如下:
<context:annotation-config></context:annotation-config>
但是這種開啟注解掃描的方式,只會掃描屬性上面的注解。實際開發中用到的並不多!故不推薦使用。
第四步,在創建對象所在的類上面使用注解實現
@Component(value="user") // 類似於<bean id="user" class="..." /> public class User { public void add() { System.out.println("add...................."); } }
如若注解里面屬性名稱是value,則可以省略,所以上面的User類亦可這樣寫為:
@Component("user") // 類似於<bean id="user" class="..." /> public class User { public void add() { System.out.println("add...................."); } }
第五步,編寫測試類
在cn.itcast.anno包下編寫一個TestDemo單元測試類。
public class TestDemo { @Test public void testUser() { ApplicationContext context = new ClassPathXmlApplicationContext("bean1.xml"); User user = (User) context.getBean("user"); System.out.println(user); user.add(); } }
Spring的bean管理中常用的注解
創建對象的注解有四個:
作用在類上@Component:
@Repository
:用於對DAO實現類進行標注(持久層)。@Service
:用於對Service實現類進行標注(業務層)。@Controller
:用於對Controller實現類進行標注(WEB層)。
后三個注解是Spring中提供的@Component
的三個衍生注解(功能目前來講是一樣的),它們是為了讓標注類本身的用途更清晰,Spring在后續的版本中會對其進行增強。
bean的作用范圍的注解
@Scope
- singleton:單例,默認值
- prototype:多例
所以我們可通過注解設置創建對象是單例或者還是多實例的。這樣User類的代碼亦可寫為:
@Service("user") @Scope("singleton") public class User { public void add() { System.out.println("add...................."); } }
使用注解注入屬性(對象)
這兒,我舉個例子來說明如何使用注解注入(對象類型的)屬性。
先創建業務層中的UserService類:
public class UserService { public void add() { System.out.println("service..........."); } }
再創建持久層中的UserDao類:
public class UserDao { public void add() { System.out.println("dao................"); } }
以上兩個類都創建在cn.itcast.anno包中。我們要實現的目的是在UserService類里面調用UserDao類的方法,這樣我們就要在UserService類里面得到UserDao類的對象。之前是采用xml配置文件的方式來注入屬性的,本文將使用注解的方式完成注入屬性的操作。
- 在UserService類里面定義UserDao類型屬性
private UserDao userDao;
在UserService類里面定義UserDao類型的屬性,由於是使用注解的方式,故不需要手動生成set方法。
- 進行注解方式實現屬性注入
- 創建UserDao類的對象和UserService類的對象
@Service("userService") public class UserService { private UserDao userDao; public void add() { System.out.println("service..........."); userDao.add(); } }
@Repository("userDao") public class UserDao { public void add() { System.out.println("dao................"); } }
- 在UserService類里面注入UserDao類的對象,使用注解來實現。首先我使用
@Autowired
注解來實現。@Service("userService") public class UserService { @Autowired private UserDao userDao; public void add() { System.out.println("service..........."); userDao.add(); } }
注意:使用注解
@Autowired
,它不是根據名字去找Dao,而是默認按類型進行裝配。
當然了,也可使用@Resource
注解來實現,如下:@Service("userService") public class UserService { @Resource(name="userDao") private UserDao userDao; public void add() { System.out.println("service..........."); userDao.add(); } }
注意,使用
@Resource
注解,它默認是按名稱進行注入的。在實際開發中,我們也是使用@Resource
注解來注入屬性的,注解@Autowired
用到的並不多。
- 創建UserDao類的對象和UserService類的對象