spring之自动装配的三种方式
时间:2022-07-23
本文章向大家介绍spring之自动装配的三种方式,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
springIOC容器可以自动装配Bean,需要做的仅仅是在<bean>中的autowire属性里指定自动装配的方式。
ByType:根据类型自动装配。若IOC容器中有多个目标Bean类型一致的bean,在这种情况下,spring将无法判定那个bean最适合该属性,所以不能执行自动装配。
ByName:根据名称自动装配,必须将目标Bean的名称和属性名设置完全相同。
contructor:通过构造器自动装配,当Bean中存在多个构造器时,此种自动装配方式将会很复杂,不推荐使用,
Car.java
package com.gong.spring.beans.autowire;
public class Car {
public Car() {
}
public Car(String name) {
this.name = name;
}
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "Car [name=" + name + "]";
}
}
Address.java
package com.gong.spring.beans.autowire;
public class Address {
private String street;
public String getStreet() {
return street;
}
public void setStreet(String street) {
this.street = street;
}
@Override
public String toString() {
return "Address [street=" + street + "]";
}
}
Student.java
package com.gong.spring.beans.autowire;
import java.util.List;
import java.util.Map;
public class Student {
private String name;
private int age;
private double score;
private Car car;
private Address address;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public double getScore() {
return score;
}
public void setScore(double score) {
this.score = score;
}
public Car getCar() {
return car;
}
public void setCar(Car car) {
this.car = car;
}
public Address getAddress() {
return address;
}
public void setAddress(Address address) {
this.address = address;
}
@Override
public String toString() {
return "Student [name=" + name + ", age=" + age + ", score=" + score + ", car=" + car + ", address=" + address
+ "]";
}
}
beans-autowire.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:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="car" class="com.gong.spring.beans.autowire.Car" p:name="baoma"></bean>
<bean id="address" class="com.gong.spring.beans.autowire.Address" p:street="络南街道"></bean>
<bean id="address2" class="com.gong.spring.beans.autowire.Address" p:street="珞狮街道"></bean>
<!--
<bean id="student" class="com.gong.spring.beans.autowire.Student" p:name="tom"
p:age="12" p:score="99.00" p:address-ref="address" p:car-ref="car"></bean>
-->
<!-- 使用byName时,要装配的bean的名字要和类文件中的setter方法中的名字保持一致,若没有匹配的,则不装配
<bean id="student" class="com.gong.spring.beans.autowire.Student" p:name="tom"
p:age="12" p:score="99.00" autowire="byName"></bean>
-->
<!-- byType根据bean的类型和当前Bean的属性自动装配,若IOC容器中有一个以上的bean可以匹配,则会抛出异常 -->
<bean id="student" class="com.gong.spring.beans.autowire.Student" p:name="tom"
p:age="12" p:score="99.00" autowire="byName"></bean>
</beans>
Main.java
package com.gong.spring.beans.autowire;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Main {
public static void main(String[] args) {
//1.创建spring的IOC容器对象
ApplicationContext ctx = new ClassPathXmlApplicationContext("beans-autowire.xml");
//2.从容器中获取Bean实例
Student student = (Student) ctx.getBean("student");
System.out.println(student.toString());
}
}
XML配置里自动装配的缺点:
(1)自动装配将会装配Bean的所有属性,然而只需要装配个别属性时,自动装配就不够灵活;
(2)要么根据类型,要么根据名称自动装配,不能两者兼顾;
(3)一般而言,在实际项目中很少使用自动装配,因为与自动装配功能带来的好处相比,明确清晰的配置方式更有说服力;
- 机器之心年度盘点:2017年人工智能领域度备受关注的科研成果
- 为什么GAC和VS引用的程序集不一致?
- GraphQL 浅谈,从理解 Graph 开始
- 分布式系统CAP理论
- 美媒盘点2018年将改变世界的四大技术趋势
- 如果你想深刻理解ASP.NET Core请求处理管道,可以试着写一个自定义的Server
- 路面能发电,智慧交通不遥远
- 小程序:企鹅帝国身后,微信帝国正悄悄露出冰山一角!
- ASP.NET MVC路由扩展:路由映射
- 如何改善遗留的代码库
- ASP.NET的路由系统:根据路由规则生成URL
- ASP.NET Core 1.0中实现文件上传的两种方式(提交表单和采用AJAX)
- 通过3个Hello World应用来了解ASP.NET 5应用是如何运行的(1)
- 工业X.0将至 企业数字化转型该怎么做?
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- android中Glide实现加载图片保存至本地并加载回调监听
- CentOS8部署LNMP环境之编译安装mysql8.0.29的教程详解
- Android获取内置sdcard跟外置sdcard路径
- Android简易电话拨号器实例详解
- Linux 为特定的用户或用户组启用或禁用 SSH的方法
- Android 中IntentFilter的匹配规则实例详解
- Android VideoCache视频缓存的方法详解
- Android标题栏最右边添加按钮的实例
- Ubuntu18.04系统安装、配置Redis及phpredis扩展操作详解
- Android电话拨号器实例详解
- Android获取App内存使用情况的方法
- linux后台运行的几种方式(小结)
- Android 实现ListView的点击变色的实例
- Android播放音乐案例分享
- linux crm部署代码详解