本次主要介绍Spring注解。
注解分为两类:
1、一类是使用Bean,即是把已经在xml文件中配置好的Bean拿来用,完成属性、方法的组装;比如@Autowired , @Resource,可以通过byTYPE(@Autowired)、byNAME(@Resource)的方式获取Bean;
2、一类是注册Bean,@Component , @Repository , @ Controller ,@Service , @Configration这些注解都是把你要实例化的对象转化成一个Bean,放在IoC容器中,等你要用的时候,它会和上面的@Autowired , @Resource配合到一起,把对象、属性、方法完美组装。
电脑
1
@Autowired或者( @Autowired(required=false))
Spring 2.5 引入了 @Autowired 注释,它可以对类成员变量、方法及构造函数进行标注,完成自动装配的工作。 通过 @Autowired的使用来消除 set ,get方法。
如果我们想使用名称装配可以结合@Qualifier注解进行使用,如下:
@Autowired() @Qualifier("baseDao")
private BaseDao baseDao;
1、required属性
required属性值可以为true( 默认值)和false。如果为true的话,没有匹配的类则抛出异常;如果为false,则表示不是强制必须能够找到相应的类,无论是否注入成功,都不会抛错。
2、工作原理
注解解析器:AutowiredAnnotationBeanPostProcessor
2.1、Spring容器启动时,AutowiredAnnotationBeanPostProcessor被注册到容器;
2.2、扫描代码,如果带有@Autowired注解,则将依赖注入信息封装到InjectionMetadata中(见扫描过程);
2.3、创建bean时(实例化对象和初始化),会调用各种BeanPostProcessor对bean初始化,AutowiredAnnotationBeanPostProcessor负责将相关的依赖注入进来;
3、@Autowired扫描过程
扫描当前类中标注@Autowired的属性和方法;
再查找父类中注@Autowired的属性和方法,依次遍历;
详解在不同场景使用的方式:https://blog.csdn.net/horacehe16/article/details/79811763
2
@Resource(这个注解属于J2EE的)
1、默认安照名称进行装配,名称可以通过name属性进行指定, 如果没有指定name属性,当注解写在字段上时,默认取字段名进行按照名称查找,如果注解写在setter方法上默认取属性名进行装配。 当找不到与名称匹配的bean时才按照类型进行装配。但是需要注意的是,如果name属性一旦指定,就只会按照名称进行装配。
Java代码
@Resource(name="baseDao")
private BaseDao baseDao;
2、 推荐使用:@Resource注解在字段上,且这个注解是属于J2EE的,减少了与spring的耦合。最重要的这样代码看起就比较优雅。
3. 只指定@Resource注解的type属性,则从上下文中找到类型匹配的唯一bean进行装配,找不到或者找到多个,都会抛出异常
4. 既指定了@Resource的name属性又指定了type,则从Spring上下文中找到唯一匹配的bean进行装配,找不到则抛出异常
END
@component
1、把普通pojo实例化到spring容器中,相当于配置文件中的<bean id="" class=""/>
2、下面写这个是引入component的扫描组件
<context:component-scan base-package=”com.mmnc”>
3、和@Bean的区别
@Component被用在要被自动扫描和装配的类上。
@Bean主要被用在方法上,来显式声明要用生成的类。
现在项目上,本工程中的类,一般都使用@Component来生成bean。在把通过web service取得的类,生成Bean时,使用@Bean和getter方法来生成bean。
@Repository
1、@Repository跟@Service,@Compent,@Controller这4种注解是没什么本质区别,都是声明作用,取不同的名字只是为了更好区分各自的功能.
2、因为接口没办法在spring.xml中用bean的方式来配置实现类吧(接口配不了),所以只能用注解或者mybatis.xml中扫描bean的方式来生成实现类。
3、@repository是用来注解接口
4、时候我们不用@repository来注解接口,我们照样可以注入到这个接口的实现类 如 图3,4 原因是我们在xml文件中扫描了其所在的包,并注册到spring容器中
@ Controller
1、@ Controller和@RestController都是标识一个类为控制器(类似于servlet)。只不过@RestController标识当前类方法返回值默认都转为json串。
2、@ Controller标识类的方法上注解@ResponseBody表示返回json数据,也就是将返回值转为json字符串。
@Service
相当于在xml配置:
<bean id="courseDAO" class="com.hzhi.course.dao.CourseDAOImpl" scope="prototype"> </bean>
@Configration
@Configuration 的注解类表示这个类可以使用 Spring IoC 容器作为 bean 定义的来源
@WebListener
注册监听器的注解:可以、参考:spring-boot 如何写监视器
END
本次介绍是在spring开启注解的基础上或者使用springboot开启注解。