7.4 使用注解實(shí)現(xiàn)自動(dòng)裝配
jdk1.5支持注解,Spring2.5開始支持注解。
要使用注解須知:
導(dǎo)入約束:context約束本鸣。
-
配置注解的支持:<context:annotation-config/> ·
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd"> <context:annotation-config/> </beans>
@Autowired
直接在屬性上使用即可弓颈!也可以在set方式上使用!
使用Autowired我們可以不用編寫Set方法了绕德,前提是你這個(gè)自動(dòng)裝配的屬性在IoC(Spring)容器中存在,且符合名字byName摊阀!
科普:
@Nullable 字段標(biāo)記了這個(gè)注解耻蛇,說(shuō)明這個(gè)字段可以為null
public People(@Nullable String name){
this.name = name;
}
public @interface Autowired {
boolean required() default true;
}
測(cè)試代碼:
public class People {
//如果顯式定義了Autowired的required屬性為false踪蹬,說(shuō)明這個(gè)對(duì)象可以為null,否則不允許為空
@Autowired(required = false)
private Dog dog;
@Autowired
private Cat cat;
private String name;
}
如果@Autowired自動(dòng)裝配的環(huán)境比較復(fù)雜臣咖,自動(dòng)裝配無(wú)法通過(guò)一個(gè)注解@Autowired完成的時(shí)候跃捣,我們可以使用@Qualifier(value="xxx")去配置@Autowired的使用,指定一個(gè)唯一的bean對(duì)象注入夺蛇!
public class People {
@Autowired
@Qualifier(value="dog11")
private Dog dog;
@Autowired
@Qualifier(value="cat11")
private Cat cat;
private String name;
}
@Resource注解
public class People {
@Resource(name = "cat2")
private Cat cat;
}
小結(jié):
@Resource和@Autowired的區(qū)別:
都是用來(lái)自動(dòng)裝配的疚漆,都可以放在屬性字段上;
@Autowired通過(guò)byType的方式實(shí)現(xiàn)刁赦,而且必須要求這個(gè)對(duì)象存在娶聘!【常用】
@Resource默認(rèn)通過(guò)byName的方式實(shí)現(xiàn),如果找不到名字甚脉,則通過(guò)byType實(shí)現(xiàn)丸升!如果兩個(gè)都找不到的情況下,就報(bào)錯(cuò)牺氨!
執(zhí)行順序不同:@Autowired通過(guò)byType的方式實(shí)現(xiàn)狡耻,@Resource默認(rèn)通過(guò)byName的方式實(shí)現(xiàn)。
8猴凹、 使用注解開發(fā)
在spring4之后夷狰,要使用注解開發(fā),必須要保證aop的包導(dǎo)入了精堕。
使用注解需要導(dǎo)入context約束孵淘,增加注解的支持!
<!--指定要掃描的包歹篓,這個(gè)包下的注解會(huì)生效-->
<context:component-scan base-package="com.kuang.pojo"/>
bean
-
屬性如何注入
//等價(jià)于<bean id="user" class="com.kuang.pojo.User"/> //@Component 組件 @Component public class User { //相當(dāng)于<property name="name" value="小憨批"/> public String name; @Value("小憨批") public void setName(String name){ this.name = name; } }
-
衍生的注解
@Component有幾個(gè)衍生注解瘫证,我們?cè)趙eb開發(fā)中,會(huì)按照mvc三層架構(gòu)分層庄撮!
- dao【@Repository】
- service【@Service】
- controller【@Controller】
這四個(gè)注解功能都是一樣的背捌,都是代表將某個(gè)類注冊(cè)到Spring中,裝配Bean洞斯!
-
自動(dòng)裝配
-@Autowired:自動(dòng)裝配通過(guò)類型毡庆,名字 如果Autowired不能唯一自動(dòng)裝配上屬性,則需要通過(guò)@Qualifier(value="xxx") -@Nullable:字段標(biāo)記了這個(gè)注解烙如,說(shuō)明這個(gè)字段可以為null -@Resource:自動(dòng)裝配通過(guò)名字么抗,類型
-
作用域
@Scope("singleton") public class User { //相當(dāng)于<property name="name" value="小憨批"/> public String name; @Value("小憨批") public void setName(String name){ this.name = name; } }
-
小結(jié)
xml與注解:
- xml更加萬(wàn)能,適用于任何場(chǎng)合亚铁!維護(hù)簡(jiǎn)單方便蝇刀。
- 注解,不是自己的類使用不了徘溢,維護(hù)相對(duì)復(fù)雜吞琐!
xml與注解最佳實(shí)踐:
- xml用來(lái)管理bean捆探;
- 注解只負(fù)責(zé)完成屬性的注入;
- 我們?cè)谑褂玫倪^(guò)程中站粟,只需要注意一個(gè)問(wèn)題:必須讓注解生效黍图,就需要開啟注解的支持。
<!--指定要掃描的包奴烙,這個(gè)包下的注解會(huì)生效--> <context:component-scan base-package="com.kuang"/> <context:annotation-config/>
9助被、 使用java的方式配置Spring
我們現(xiàn)在要完全不適用Spring的xml配置了,全權(quán)交給java來(lái)做切诀!
javaConfig是Spring的一個(gè)子項(xiàng)目恰起,在Spring4之后,它成為了一個(gè)核心功能趾牧。
實(shí)體類:
@Component
public class User {
private String name;
public String getName() {
return name;
}
@Value("小笨蛋")
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
'}';
}
}
import com.kuang.pojo.User;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
//這個(gè)也會(huì)被Spring容器托管,注冊(cè)到容器中肯污,因?yàn)楸緛?lái)就是一個(gè)@Component
//@Configuration代表這是一個(gè)配置類翘单,就和我們之前看的beans.xml
@Configuration
@ComponentScan("com.kuang.pojo")
@Import(KuangConfig2.class )
public class KuangConfig {
//注冊(cè)一個(gè)bean,就相當(dāng)于我們之前寫的一個(gè)bean標(biāo)簽
//這個(gè)方法的名字蹦渣,就相當(dāng)于bean標(biāo)簽中的id屬性
//這個(gè)方法的返回值哄芜,就相當(dāng)于bean標(biāo)簽中的class屬性
@Bean
public User getUser(){
return new User();//就是返回要注入到bean的對(duì)象
}
}
測(cè)試類:
public class MyTest {
public static void main(String[] args) {
//如果完全使用了配置類方式去做,我們就只能通過(guò)AnnotationConfig上下文來(lái)獲取容器柬唯,通過(guò)配置類的class對(duì)象加載认臊!
ApplicationContext context = new AnnotationConfigApplicationContext(KuangConfig.class);
User getUser = (User) context.getBean("getUser");
System.out.println(getUser.getName());
}
}
這種純java的配置方式,在SpringBoot中隨處可見锄奢!