1、什么是注解
(1)注解是代码特殊标记,格式:@注解名称(属性名称=属性值, 属性名称=属性值..)
(2)使用注解,注解作用在类上面,方法上面,属性上面
(3)使用注解目的:简化 xml 配置
2、Spring 针对 Bean 管理中创建对象提供的注解
(1)@Component
(2)@Service (service层)
(3)@Controller (web层)
(4)@Repository (Dao层)
* 上面四个注解功能是一样的,都可以用来创建 bean 实例
3、基于注解方式实现对象创建
第一步 引入依赖
第二步 开启组件扫描
<!--开启组件扫描1 如果扫描多个包,多个包使用逗号隔开2 扫描包上层目录--><context:component-scan base-package="com.atguigu.spring5.dao,com.atguigu.spring5.service"></context:component-scan><!--或--><context:component-scan base-package="com.atguigu"></context:component-scan>
第三步 创建类,在类上面添加创建对象注解
package com.atguigu.spring5.service;import org.springframework.stereotype.Component;//在注解里面 value 属性值可以省略不写,//默认值是类名称,首字母小写//UserService -- userService@Component(value = "userService")//与 <bean id="userService" class=".."/> 类似的写法public class UserService {public void add(){System.out.println("service add......");}}
4、开启组件扫描细节配置
<!--示例 1use-default-filters="false" 表示现在不使用默认 filter,自己配置 filtercontext:include-filter ,设置扫描哪些内容--><context:component-scan base-package="com.atguigu" use-default-filters="false"><context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/><!--到com.atguigu包中只扫描带Controller注解的类--></context:component-scan>
<!--示例 2下面配置扫描包所有内容context:exclude-filter: 设置哪些内容不进行扫描--><context:component-scan base-package="com.atguigu"><context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/><!--到com.atguigu包中不扫描带Controller注解的类--></context:component-scan>
有了这个扫描机制之后呢,只需要在类上加个注解,Spring容器一扫描到这个注解,就会自动实例化这个类。对于扫描到的类, Spring 有默认的命名策略:使用非限定类名,第一个字母小写,也可以在注解中通过 value 属性值标识组件的名称。
5、基于注解方式实现属性注入
(1)@Autowired:根据属性类型进行自动装配
第一步 把 service 和 dao 对象创建,在 service 和 dao 类添加创建对象注解
第二步 在 service 注入 dao 对象,在 service 类添加 dao 类型属性,在属性上面使用注解
@Servicepublic class UserService {//定义 dao 类型属性//不需要添加 set 方法//添加注入属性注解@Autowiredprivate UserDao userDao;public void add() {System.out.println("service add......");userDao.add();}}
(2)@Qualifier:根据属性名称进行注入
这个@Qualifier 注解的使用,和上面@Autowired 一起使用
@Servicepublic class UserService {//定义 dao 类型属性//不需要添加 set 方法//添加注入属性注解@Autowired//根据类型进行注入@Qualifier(value = "userDaoImpl1")//根据名称进行注入private UserDao userDao;public void add() {System.out.println("service add......");userDao.add();}}//一个接口可能有多个实现类
同一个接口的多个实现类中,如果不少于2个实现类都有创建对象的注解,那么只用@Autowired会报错(可能是因为用的是多态UserDao),所以就要用@Qualifier,同时实现类要确定各自的value值。
(3)@Resource:可以根据类型注入,也可以根据名称注入
// @Resource//根据类型进行注入@Resource(name = "userDaoImpl2")//根据名称进行注入private UserDao userDao;
@Resource是javax.annotation.Resource;中的
spring官方建议用@Autowired和@Qualifier(value = “”)来代替@Resource
以上三个都是针对对象类型的注入,不针对普通类型的注入
类似@Component , @Repository , @ Controller , @Service 这些注册Bean的注解存在局限性,只能局限作用于自己编写的类,
(4)@Value:注入普通类型属性
@Value(value = "abc")private String name;
6、完全注解开发
(1)创建配置类,替代 xml 配置文件
@Configuration//作为配置类,替代 xml 配置文件@ComponentScan(basePackages = {"com.atguigu"})public class SpringConfig {}
(2)编写测试类
@Testpublic void testService2() {//加载配置类ApplicationContext context = new AnnotationConfigApplicationContext(SpringConfig.class);UserService userService = context.getBean("userService", UserService.class);System.out.println(userService);userService.add();}
注解int字段和集合类型的属性不方便???
