如何使用以上的注解呢?
- 第一步:加入aop的依赖(已经包在context包里面)
- 第二步:在配置文件中添加context命名空间
- 第三步:在配置文件中指定扫描的包
- 第四步:在Bean类上使用注解
第一步:加入aop的依赖
我们可以看到当加入spring-context依赖之后,会关联加入aop的依赖。所以这一步不用做。
第二步:在配置文件中添加context命名空间
<?xml version="1.0" encoding="UTF-8"?><beansxmlns="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"></beans>第三步:在配置文件中指定要扫描的包
<?xml version="1.0" encoding="UTF-8"?><beansxmlns="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"><context:component-scanbase-package="com.powernode.spring6.bean"/></beans>第四步:在Bean类上使用注解
packagecom.powernode.spring6.bean;importorg.springframework.stereotype.Component;@Component(value="userBean")publicclassUser{}编写测试程序:
packagecom.powernode.spring6.test;importcom.powernode.spring6.bean.User;importorg.junit.Test;importorg.springframework.context.ApplicationContext;importorg.springframework.context.support.ClassPathXmlApplicationContext;publicclassAnnotationTest{@TestpublicvoidtestBean(){ApplicationContextapplicationContext=newClassPathXmlApplicationContext("spring.xml");UseruserBean=applicationContext.getBean("userBean",User.class);System.out.println(userBean);}}如果注解的属性名是value,那么value是可以省略的。
packagecom.powernode.spring6.bean;importorg.springframework.stereotype.Component;@Component("vipBean")publicclassVip{}packagecom.powernode.spring6.test;importcom.powernode.spring6.bean.Vip;importorg.junit.Test;importorg.springframework.context.ApplicationContext;importorg.springframework.context.support.ClassPathXmlApplicationContext;publicclassAnnotationTest{@TestpublicvoidtestBean(){ApplicationContextapplicationContext=newClassPathXmlApplicationContext("spring.xml");VipvipBean=applicationContext.getBean("vipBean",Vip.class);System.out.println(vipBean);}}如果把value属性彻底去掉,spring会被Bean自动取名吗?会的。并且默认名字的规律是:Bean类名首字母小写即可。
packagecom.powernode.spring6.bean;importorg.springframework.stereotype.Component;@ComponentpublicclassBankDao{}也就是说,这个BankDao的bean的名字为:bankDao
测试一下
packagecom.powernode.spring6.test;importcom.powernode.spring6.bean.BankDao;importorg.junit.Test;importorg.springframework.context.ApplicationContext;importorg.springframework.context.support.ClassPathXmlApplicationContext;publicclassAnnotationTest{@TestpublicvoidtestBean(){ApplicationContextapplicationContext=newClassPathXmlApplicationContext("spring.xml");BankDaobankDao=applicationContext.getBean("bankDao",BankDao.class);System.out.println(bankDao);}}我们将Component注解换成其它三个注解,看看是否可以用:
packagecom.powernode.spring6.bean;importorg.springframework.stereotype.Controller;@ControllerpublicclassBankDao{}剩下的两个注解大家可以测试一下。
如果是多个包怎么办?有两种解决方案:
- 第一种:在配置文件中指定多个包,用逗号隔开。
- 第二种:指定多个包的共同父包。
先来测试一下逗号(英文)的方式:
创建一个新的包:bean2,定义一个Bean类。
packagecom.powernode.spring6.bean2;importorg.springframework.stereotype.Service;@ServicepublicclassOrder{}配置文件修改:
<?xml version="1.0" encoding="UTF-8"?><beansxmlns="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"><context:component-scanbase-package="com.powernode.spring6.bean,com.powernode.spring6.bean2"/></beans>测试程序:
packagecom.powernode.spring6.test;importcom.powernode.spring6.bean.BankDao;importcom.powernode.spring6.bean2.Order;importorg.junit.Test;importorg.springframework.context.ApplicationContext;importorg.springframework.context.support.ClassPathXmlApplicationContext;publicclassAnnotationTest{@TestpublicvoidtestBean(){ApplicationContextapplicationContext=newClassPathXmlApplicationContext("spring.xml");BankDaobankDao=applicationContext.getBean("bankDao",BankDao.class);System.out.println(bankDao);Orderorder=applicationContext.getBean("order",Order.class);System.out.println(order);}}我们再来看看,指定共同的父包行不行:
<?xml version="1.0" encoding="UTF-8"?><beansxmlns="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"><context:component-scanbase-package="com.powernode.spring6"/></beans>