新手学习spring 勿喷谢谢 若有不对之处请多多指教
Spring的三种装配方式 1、在xml中显示的装配 autowire 可以通过bytype和byname的方式实现 必须得有set方法 2、在java中显示配置 用的很少 3、隐式的自动装配bean【重要】
项目依赖:
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.2.12.RELEASE</version>
</dependency>
项目结构
一、 通过bean进行自动装配
pojo层
cat.java
public class Cat {
public void shout(){
System.out.println("喵");
}
}
dog.java
public class Dog {
public void shout(){
System.out.println("汪汪");
}
}
persional.java
public class Personal {
private Dog dog;
private Cat cat;
private String name;
public Personal() {
}
public Personal(Dog dog, Cat cat,String name) {
this.dog = dog;
this.cat = cat;
this.name = name;
}
public Dog getDog() {
return dog;
}
public Cat getCat() {
return cat;
}
public void setDog(Dog dog) {
this.dog = dog;
}
public void setCat(Cat cat) {
this.cat = cat;
}
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
@Override
public String toString() {
return "Personal{" +
"dog=" + dog +
", cat=" + cat +
'}';
}
}
beans.xml
<bean id="cat" class="com.hq.pojo.Cat"/>
<bean id="dog" class="com.hq.pojo.Dog"/>
<bean id="personal" class="com.hq.pojo.Personal" autowire="byName">
<property name="name" value="hhh"/>
<!--autowire也可以写成以下形式 ref值必须和引用的bean的id值一致 -->
<!-- <property name="cat" ref="cat"/>-->
<!-- <property name="dog" ref="dog"/>-->
</bean>
测试结果
小结:
在ioc(Spring)容器也就是在xml中配置自动注入的时候 不管是通过name还是type 这个bean都得有相应的set方法,不然会报错的,报错截图如下,这种自动装配有个缺陷就是有多个bean的时候,无法定位到我们想要的那个 bean
byname 的话 是通过name获取也就是set方法 set后的那个,看下面的截图说明
byType是通过类型名来找的,不管id名 但是用这种自动装配的时候 ,这个容器中这个类型名只能出现一次,不然会报错,看下面的截图说明
byName
byType
二 、通过注解实现自动装配
pojo层原封不动
首先看xml
<?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">
<bean id="cat1" class="com.hq.pojo.Cat"/>
<bean id="cat2" class="com.hq.pojo.Cat"/>
<bean id="dog2" class="com.hq.pojo.Dog"/>
<bean id="personal" class="com.hq.pojo.Personal" autowire="byName">
<property name="name" value="hq"/>
<!-- <property name="cat" ref="cat"/>-->
<!-- <property name="dog" ref="dog"/>-->
</bean>
<!-- 开启注解的支持-->
<context:annotation-config/>
</beans>
每天一个小技巧
这里可以观察下 xml中引入的一些约束 注释掉context标签就知道那些是属于他的约束,beans 换成context 就是contenxt的约束
现在回到pojo.java
public class Personal {
@Autowired
private Dog dog;
@Autowired
@Qualifier(value = "cat1")
private Cat cat;
private String name;
public Personal() {
}
public Personal(Dog dog, Cat cat,String name) {
this.dog = dog;
this.cat = cat;
this.name = name;
}
public Dog getDog() {
return dog;
}
public Cat getCat() {
return cat;
}
// public void setDog2(Dog dog) {
// this.dog = dog;
// }
//
// public void setCat1(Cat cat) {
// this.cat = cat;
// }
//
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
@Override
public String toString() {
return "Personal{" +
"dog=" + dog +
", cat=" + cat +
'}';
}
}
这里使用注解@Autowired 自动装配,使用这个注解装配的好处就是不在需要写set方法,由于我的xml中有两个cat的bean所以 使用@Qualifier指定一个bean进行装配,不指定会报错,因为不知道是哪一个
测试结果
最后补充一点
自动装配还有@Resource 注解,这个注解是java的 @AutoWired是spring框架的,一般用后者,两者简单对比一下
@Resource 是java 的 默认通过bytype的方式实现 如果找不到name 则会通过bytype进行查找 都找不到就报错
@AutoWired 是 spring框架的 通过byname的方式实现 而且必须要求这个对象存在