基于注解的方式配置在实际开发中使用更加广泛,一般只有非自己编写的类,需要将对象放入到IOC容器中管理才会使用到xml的配置,相比XML配置来说,注解更加简单。
并不是说使用了注解之后,就可以不用使用xml文件,使用注解也需要配置xml文件,但是xml文件配置的不再是bean,而是配置扫描,扫描的配置指的是,Spring能够从配置的指定的classpath中自动扫描,侦测和实例化具有特定的Spring注解的组件【类】。Spring的特定的注解有哪些呢?
@Component:基本注解,标识一个受到Spring管理的组件@Resposity:是基本注解的子注解,标识在数据访问层,表示是一个受到了Spring管理的组件@Service:是基本注解的子注解,标识在业务层【服务层】,表示是一个受到了Spring管理的组件@Controller:是基本注解的子注解,标识在控制层,表示是一个受到了Spring管理的组件范例:使用注解:
步骤1:加入jar包
commons-logging-1.1.3.jar
spring-aop-4.0.0.RELEASE.jar
spring-beans-4.0.0.RELEASE.jar
spring-context-4.0.0.RELEASE.jar
spring-core-4.0.0.RELEASE.jar
spring-expression-4.0.0.RELEASE.jar
步骤2:编写需要加入到SpringIOC容器中管理的组件
@Component public class Car { private String brand; public String getBrand() { return brand; } public void setBrand(String brand) { thisbrand = brand; } @Override public String toString() { return "Car [brand=" + brand + "]"; } }步骤3:编写Spring的配置文件
<!-- 配置自动扫描的包:表示这个包【或者子包】中带有Spring注解的组件会被IOC容器管理 context:component-scan : 用来配置自动扫描的包 base-package : 表示配置扫描的基础包,则表示会扫描此包及其子包中所有的Spring的注解 --> <context:component-scan base-package="com.wanbangee.annotation"></context:component-scan> </beans>步骤4:编写测试类
public class Main { public static void main(String[] args) { ApplicationContext act = new ClassPathXmlApplicationContext("annotation.xml"); Car car = act.getBean(Car.class); System.out.println(car); } }如何进行属性注入:在组件类中的setter方法或者属性名上面使用@Value注解,进行属性注入
@Value(value="Audi")//@Value("Audi"),如果注解中只设置value属性的值,则可以省略value=我们在测试类中,获取bean的方式是用过bean的类型获取,如果要通过bean的id获取,那么注解的组件的bean的id如何配置呢?
/* * 如果不设置bean的id,则默认的bean的id是类名首字母小写 * 可以在注解中使用value属性设置bean的id,如果设置了bean的id,则默认id失效 * @Component(value="car1") 和 @Component("car1") 如果注解中只设置value属性的值,则可以省略value= */ @Component("car1")我们目前只使用了基本注解,那么其他的三个子注解如何使用呢?四个注解在实际使用中是一致的,但是从理论上讲,又是不一致的。我们在开发中实际四个注解应该使用在这个注解所表示层级。
配置自动扫描的包,能扫描到子包吗?能够扫描当前配置包和其子包
实际上在开发中,对于注解使用是最多的,因为注解相比配置文件来说,更加简单。
使用注解的话,有四种将类放到IOC容器中管理的方式。