Spring IoC注解式开发

一,常用注解

1.声明Bean注解

注解解释

@Component
@Controller
@Service
@Repository
这四个注解的功能都一样。用哪个都可以。
只是为了增强程序的可读性,建议:
	● 控制器类上使用:Controller
	● service类上使用:Service
	● dao类上使用:Repository
他们都是只有一个value属性。value属性用来指定bean的id,也就是bean的名字。value属性可以省略,省略后默
认名子是bean类类名首字母小写

如何使用以上注解

● 第一步:加入aop的依赖
● 第二步:在配置文件中添加context命名空间
● 第三步:在配置文件中指定扫描的包
● 第四步:在Bean类上使用注解

选择性实例化bean

需求:假设在某个包下有很多Bean,有的Bean上标注了Component,有的标注了Controller,有的标注了Service,有的标注了Repository,现在由于某种特殊
业务的需要,只允许其中所有的Controller参与Bean管理,其他的都不实例化。这应该怎么办呢?
xml 复制代码
<context:component-scan base-package="com.powernode.spring6.bean3" use-default-filters="false">
        <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
    </context:component-scan>
use-default-filters="true" 表示:使用spring默认的规则,只要有Component、Controller、Service、Repository中的任意一个注解标注,则进行实例化。
use-default-filters="false" 表示:不再spring默认实例化规则,即使有Component、Controller、Service、Repository这些注解标注,也不再实例化。
<context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/> 表示只有Controller进行实例化。

也可以将use-default-filters设置为true(不写就是true),并且采用exclude-filter方式排出哪些注解标注的Bean不参与实例化:

xml 复制代码
<context:component-scan base-package="com.powernode.spring6.bean3">
  <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Repository"/>
  <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Service"/>
  <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>

2.负责注入的注解

@value

当属性的类型是简单类型时,可以使用@Value注解进行注入。
@Value注解可以出现在属性上、setter方法上、以及构造方法的形参上。

@Autowired与@Qualifier

@Autowired注解可以用来注入非简单类型。被翻译为:自动连线的,或者自动装配。
单独使用@Autowired注解,默认根据类型装配。【默认是byType】
java 复制代码
package org.springframework.beans.factory.annotation;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target({ElementType.CONSTRUCTOR, ElementType.METHOD, ElementType.PARAMETER, ElementType.FIELD, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Autowired {
	boolean required() default true;
}
源码中有两处需要注意:
● 第一处:该注解可以标注在哪里?
	○ 构造方法上
	○ 方法上
	○ 形参上
	○ 属性上
	○ 注解上
● 第二处:该注解有一个required属性,默认值是true,表示在注入的时候要求被注入的Bean必须是	存在的,如果不存在则报错。如果required属性设置为
false,表示注入的Bean存在或者不存在都没关系,存在的话就注入,不存在的话,也不报错。

问题,Autowired默认是根据类型自动装配的,如果一个接口有多个实现类,当我们装配接口的时候就会出问题,如何解决?

当然要byName,根据名称进行装配了。
@Autowired注解和@Qualifier注解联合起来才可以根据名称进行装配,在@Qualifier注解中指定	Bean名称。
java 复制代码
 	@Autowired
    @Qualifier("userDaoForOracle") // 这个是bean的名字。
总结:
@Autowired注解可以出现在:属性上、构造方法上、构造方法的参数上、setter方法上。
当带参数的构造方法只有一个,@Autowired注解可以省略。
@Autowired注解默认根据类型注入。如果要根据名称注入的话,需要配合@Qualifier注解一起使用。

@Resource

@Resource注解也可以完成非简单类型注入。那它和@Autowired注解有什么区别?
	● @Resource注解是JDK扩展包中的,也就是说属于JDK的一部分。所以该注解是标准注解,更加具有通用性。(JSR-	250标准中制定的注解类型。JSR是Java规范提案。)
	● @Autowired注解是Spring框架自己的。
	● @Resource注解默认根据名称装配byName,未指定name时,使用属性名作为name。通过name找不到的话会自动启动通过类型byType装配。
	● @Autowired注解默认根据类型装配byType,如果想根据名称装配,需要配合@Qualifier注解一起用。
	● @Resource注解用在属性上、setter方法上。
	● @Autowired注解用在属性上、setter方法上、构造方法上、构造方法参数上。
@Resource注解属于JDK扩展包,所以不在JDK当中,需要额外引入以下依赖:【如果是JDK8的话不需要额外引入依赖。高于JDK11或低于JDK8需要引入以下依赖。】

spring6+ 使用如下依赖

xml 复制代码
<dependency>
  <groupId>jakarta.annotation</groupId>
  <artifactId>jakarta.annotation-api</artifactId>
  <version>2.1.1</version>
</dependency>

一定要注意:如果你用Spring6,要知道Spring6不再支持JavaEE,它支持的是JakartaEE9。(Oracle把JavaEE贡献给Apache了,Apache把JavaEE的名字改成JakartaEE了,大家之前所接触的所有的 javax.* 包名统一修改为 jakarta.*包名了。)

spring5-使用如下依赖

xml 复制代码
<dependency>
  <groupId>javax.annotation</groupId>
  <artifactId>javax.annotation-api</artifactId>
  <version>1.3.2</version>
</dependency>
一句话总结:一句话总结@Resource注解:默认byName注入,没有指定name时把属性名当做name,根据name找不到时,才会byType注入。byType注入时,某种类
型的Bean只能有一个。

二.全注解式开发

所谓的全注解开发就是不再使用spring配置文件了。写一个配置类来代替配置文件。
java 复制代码
@Configuration //说明该类为配置类,代替spring.xml
@ComponentScan({"com.powernode.spring6.dao", "com.powernode.spring6.service"}) //扫描某个包,并将包下的类归于spring管理
相关推荐
码农研究僧11 分钟前
Spring Boot 中的事件发布与监听:深入理解 ApplicationEventPublisher(附Demo)
java·spring boot·后端·事件发布与监听
NiNg_1_23413 分钟前
Spring Boot 实现文件上传和下载
java·spring boot·后端·文件上传
gentle_ice1 小时前
leetcode——二叉树的中序遍历(java)
java·数据结构·算法·leetcode
苹果酱05671 小时前
mysql.sock.lock 导致mysql重启失败
java·spring boot·毕业设计·layui·课程设计
吃一口大米饭1 小时前
合并两个有序链表(leetcode刷题)
java·数据结构·算法·leetcode·链表
简 洁 冬冬2 小时前
Java中的Servlet
java·开发语言·servlet
fly spider2 小时前
多线程-线程池的使用
java·面试·线程池·多线程·juc
组合缺一2 小时前
Solon Cloud Gateway 开发:导引
java·gateway·reactor·solon·响应式
陈平安Java and C3 小时前
二叉树介绍
java
S-X-S3 小时前
sunrays-framework配置重构
java·重构