基于xml方法见:http://t.csdnimg.cn/dir8j
注解是代码中的一种特殊标记,可以在编译、类加载和运行时被读取,执行相应的处理,简化 Spring的 XML配置。
格式:@注解(属性1="属性值1",...)
可以加在类上、属性上、方法上。
Spring 通过注解实现自动装配的步骤如下:
引入依赖:与xml同,不做赘述
开启组件扫描
使用注解定义 Bean
依赖注入
一、开启组件扫描
配置bean.xml文件扫描:<context:component-scan>
Spring 默认不使用注解装配 Bean,因此我们需要在 Spring的 XML 配置中(bean.xml),通过<context:component-scan>开启 Spring Beans的自动扫描功能。
需在bean.xml文件最上头添加:
开启此功能后,Spring 会自动从扫描指定的包(base-package 属性)及其子包下的所有类,如果类上使用了 @Component 注解,就将该类装配到容器中。
1. 最基本的扫包:扫描指定的包及其子包下的所有类
2. 指定要排除的组件:<context:exclude-filter>指定排除规则
属性type:设置排除或包含的依据
type="annotation",根据注解排除,expression中设置要排除的注解的全类名
type="assignable",根据类型排除,expression中设置要排除的类型的全类名
3. 仅扫描指定的组件:<context:include-filter>
其他与1.2相同。
二、使用注解定义Bean
以下注解写在类前,将类定义成Spring Bean。
这四个注解的作用功能一模一样,只是给开发者做一些区分。
value值与xml中bean的id作用相同,不写的话默认为该类的首字母小写的字符串。
三、依赖注入
1. @Autowired注入
在IoC容器匹配bean时,自动为该bean依赖的类类型、接口类型的属性赋值。
对应xml中的bean属性autowired,同样有两种:byType和byName。默认byType
可以加在构造方法、方法、属性、形参、注解上。
该注解有一个required属性,默认值是true,表示在注入的时候要求被注入的Bean必须是存在的,如果不存在则报错。如果required属性设置为false,表示注入的Bean存在或者不存在都没关系,存在的话就注入,不存在的话,也不报错。
以下例子中:
创建三个包,controller、Service、dao,其中controller包下有一个UserController类,Service包下有userService接口和实现该接口的userServiceImpl类,dao包下有userDao接口和实现该接口的userDaoImpl类。
1.1 属性注入:
1.2 set注入:在该属性的set方法前加注解
1.3 构造方法注入
如果只有一个有参构造函数,无参构造也没有,可以省略注解
1.4 形参注入
2. @Qualifier注入
与@Autowired联合使用,为byName注入:当接口有多个实现类时,使用byType注入会报错。
@Qualifier注解中的value属性为接口的一个实现类的类名(把首字母小写)
3. @Resource注入
@Resource注解也可以完成属性注入。那它和@Autowired注解有什么区别?
@Resource注解是JDK扩展包中的,也就是说属于JDK的一部分。所以该注解是标准注解,更加具有通用性。@Autowired注解是Spring框架自己的。
@Resource注解默认byName,未指定name时,使用属性名作为name。通过name找不到的话会自动启动通过类型byType装配。@Autowired注解默认byType,如果想根据名称装配,需要配合@Qualifier注解一起用。
@Resource注解用在属性上、set方法上。@Autowired注解用在属性上、set方法上、构造方法上、构造方法参数上。
@Resource注解属于JDK扩展包,所以不在IDK当中,需要额外引入以下依赖:(如果是JDK8的话不需要额外引入依赖。高于JDK11或低于JDK8需要引入以下依赖。)
使用:给Service的实现类通过@Service去个别名,在@Resource中设置好name。
如果@Resource中没有设置name,要保证属性名与别名一致。
如果@Resource没有设置name,也没有令属性名与别名保持一致,则会自动byType,但要保证该类型的bean唯一:
四、全注解开发
即不使用配置文件bean.xml,而是使用一个配置类来替代。
@Configuration注解:标注一个类为配置类。
@ComponentScan注解:替代配置类中<context:component-scan>标签,实现开启组件扫描功能,