微信開發(fā)者中心aso優(yōu)化貼吧
1.關于Spring中的注解裝配的作用
Spring中的注解裝配簡化了xml中bean的配置,大大提高了開發(fā)效率。
原本我們想在spring容器中使用某個類需要先在xml中配置該類的bean。使用注解后可以直接通過包掃描的方式自動在我們調用類時自動裝配。
例如:
當我們想要使用UserDaO實現(xiàn)類時需要再Xml配置文件上添加如下配置
<bean id="userDao" class="com.yc.dao.impl.UserDaoImpl" />
?但是到我們在類上添加注解:@complicate一樣可以到達上述xml的效果
@Repository("userDao") public class UserDaoImpl implements UserDao {@Overridepublic void getUser() {System.out.println("注解測試==>、、、");return ;} }
xml中的
<bean class="com.xxxx" />就相當于===》@Repository()
而<bean id="userDao"? /> 就箱單于==》@Repository("userDao")
但為了可以識別到我們的注解需要再xml中配置包掃描:
<context:component-scan base-package="com.yc"/>//此處的包要寫成自己對應的項目包
如此一來bean的配置也就大大簡化,提高了開發(fā)效率。
2.Ioc中的注解:
注解 | 說明 |
---|---|
@Component | 使用在類上用于實例化Bean 相當于 <bean></bean> |
@Controller | 使用在web層類上用于實例化Bean |
@Service | 使用在service層類上用于實例化Bean |
@Repository | 使用在dao層類上用于實例化Bean |
需要注意的是:使用注解時,當類級別注解不指定具體的 bean 名稱時,Spring 會使用類的名稱(byname)作為 bean 的名稱,比如UserDaoImpl的類加上注解@Repository,而不設置注解參數(shù)時,spring會默認以userDaoImpl作為該bean的 id。所以在使用過程中應該注意。
例如:
你會發(fā)現(xiàn)注解不設置參數(shù)時
@Repository public class UserDaoImpl implements UserDao { private User user; public void setUser(User user){ this.user=user; }@Override public void getUser() { System.out.println("注解測試==>、、、"); return ; } }
?當我通過測試類去調用時,控制臺就會報錯,顯示找不到bean。
測試類如下:
@Testpublic void Springtest2(){ClassPathXmlApplicationContext cac=new ClassPathXmlApplicationContext("springConfig.xml");UserDao userDao=cac.getBean(UserDaoImpl.class);userDao.getUser();System.out.println("````");}
而加上(“userDao”)便可以找到
@Repository("userDao") public class UserDaoImpl implements UserDao { private User user; public void setUser(User user){ this.user=user; }@Override public void getUser() { System.out.println("注解測試==>、、、"); return ; } }
原因:
在 Spring 框架中,
@Repository
注解用于標識一個類屬于數(shù)據訪問層(DAO)的組件。默認情況下,Spring 會按照類型來查找并創(chuàng)建相應的 bean 實例。在示例中,當類級別注解
@Repository
不指定具體的 bean 名稱時,Spring 使用類的名稱(byname)作為 bean 的名稱此處的例子即以userDaoImpl作為其名稱而不是以userDao為名稱,所以在容器掃描識別時才會顯示找不到userDao的bean,容器只掃描到userDaoImpl的bean。因此,如果你的類名為UserDaoImpl
,那么根據默認的查找規(guī)則,Spring 將會尋找一個名為 "userDaoImpl" 的 bean。對于第一個示例中的類:
@Repository public class UserDaoImpl implements UserDao {// ... }
如果未在
@Repository
注解中指定 bean 的名稱,Spring 默認會使用類名小寫(camelCase)。因此,它將在上下文中查找名為 "userDaoImpl" 的 bean。如果找不到與該名稱匹配的 bean,就會出現(xiàn)找不到 bean 的錯誤。而對于第二個示例中的類:
java
@Repository("userDao") public class UserDaoImpl implements UserDao {// ... }
@Repository
注解指定了具體的 bean 名稱為 "userDao",這意味著 Spring 在上下文中查找名為 "userDao" 的 bean,并成功創(chuàng)建了實例。綜上所述,注解
@Repository
的查找方式實際上是基于 bean 的名稱(byname)進行查找的。你可以通過顯式指定@Repository
注解的值,來定制 bean 名稱并避免找不到 bean 的錯誤。
3.DI注解
注解 | 說明 |
---|---|
@Autowired | 使用在字段上用于根據類型依賴注入,相當于 <property></property> ,根據類型注入。底層使用反射 |
@Qualifier | 結合@Autowired一起使用,不能單獨使用。根據id查找同類型下的實例 |
@Resource | 相當于@Autowired+@Qualifier,按照名稱進行注入 |