java注解注⼊实体类_最详细的SpringIOC注⼊(xml注⼊+注解
注⼊)
@[toc](Spring IOC 容器的基本使⽤)
⼀、为什么要使⽤ Spring?
1.1 传统的 MVC 架构的程序
1.2 程序耦合性过⾼?
1.3 如何解耦?
1.4 Spring IOC 的依赖注⼊
⼆、Spring IOC 的依赖注⼊
2.1 使⽤构造函数完成依赖注⼊
2.1.1 标签的使⽤讲解
2.1.2 构造函数依赖注⼊的优缺点
2.1.3 使⽤构造函数完成依赖注⼊的实例
2.2 使⽤ setter 完成注⼊
2.2.1 使⽤ setter 完成依赖注⼊的功能
2.2.2 基于 setter 完成依赖注⼊的分析
2.3 复杂数据类型注⼊
2.3.1 集合数据类型注⼊使⽤场景
2.3.2 集合类型的数据注⼊
三、使⽤注解完成 Spring 的 IOC 注⼊
3.1 ⽤于创建对象的注解
3.1.1 普通⽅法创建对象
3.1.2 Componet 注解(还有和它功能⼀样的三层注解)
3.2 ⽤于注⼊数据的注解
3.2.1 数据⽅式剖析
3.2.2 注⼊⽅式⼀(Autowired + Qualifier)
3.2.3 基于 Resource 的注解
四、Spring IOC 注⼊总结
本⽂的代码过多,但是每个点我会尽可能的写的很详细
⼀、为什么要使⽤ Spring?
1.1 传统的 MVC 架构的程序
我们平时编写⼀个⼩项⽬的时候,⼀般会采⽤ MVC 三层架构来编写⼀个项⽬
M —— modal 模型层(实体类)
V —— views 视图层 (界⾯)
C —— controller 控制层 (⽤来完执⾏⼀些操作)
这三层架构各⾃分⼯,独⾃完成相对应的功能,但是这样的程序写出来会导致程序之间耦合性过⾼
1.2 程序耦合性过⾼?
耦合性过⾼实际上说的是程序之间的依赖性过⾼,解耦说的就是降低程序之间的依赖关系
我们使⽤ Java 通常都是写好⼀个类,构造⽅法,setter 和 getter 等等,我们在其他的类中使⽤该类就得 创建⼀个 该类的对象,然后通过对象调⽤该类的各种⽅法。这样整个程序之间就会产⽣多个类,对应的也会产⽣多个对象互相进⾏调⽤,因此我们整体的程序就会体现出耦合性过⾼的特点。
1.3 如何解耦?
我们在 Java SE 中学习过 JDBC,也学习过 properties 对象, 我们可以把 jdbc 的⼀些配置写进⽂件中。
我们传统⼀般都是创建对象,我们可以换⼀种⽅式,通过 Java 的反射机制获取类的信息,并且创建对象
读取 xml ⽂件
1.4 Spring IOC 的依赖注⼊
Spring 框架正式为了解决这样的情况出现了,它提供了 读取 xml配置,以及注解 两种⽅式实现 bean 的⾃动注⼊,⽽被注⼊的容器叫做IOC 容器
依赖注⼊:
Dependency Injection
IOC 的作⽤:
降低程序键的耦合(依赖关系)
依赖关系的管理:
以后都交给 spring 来维护
在当前类需要⽤到其他类的对象,由Spring来为我们提供,我们只需要在配置⽂件中说明
依赖关系的维护:
就称为依赖注⼊
依赖注⼊:
能注⼊的数据,有三类
基本类型和 string
其他 bean 类型(在配置⽂件中或者注解配置过的 bean—)
复杂类型、集合类型
注⼊的⽅式:有三种
第⼀种:使⽤构造函数提供
第⼆种:使⽤ set⽅法提供
第三种:使⽤注解提供
⼆、Spring IOC 的依赖注⼊
2.1 使⽤构造函数完成依赖注⼊
2.1.1 标签的使⽤讲解
使⽤的标签:constructor-arg
标签出现的位置:bean标签的内部
标签中的属性
1. type:⽤于指定要注⼊的数据的数据类型,该数据类型可以是构造函数中某个或某些参数的类型
2. index: ⽤于指定要注⼊的数据给构造函数中指定索引位置的参数赋值,索引的位置也是从 0 开始
3. name:⽤于指定构造函数中指定名称的参数赋值
以上三个标签⽤于指定给构造函数中哪个参数赋值
5. value: ⽤于给基本类型和 String类型的数据
6. ref:⽤于指定其它的 bean 类型数据,它指的就是 spring IOC 核⼼容器中出现过的 bean 对象2.1.2 构造函数依赖注⼊的优缺点
优势:
在获取 bean 对象时,注⼊数据是必须的操作,否则对象⽆法创建成功
弊端:
改变了bean 对象的实例化⽅式,使我们在创建对象时,如果⽤不到,也必须创建
2.1.3 使⽤构造函数完成依赖注⼊的实例
注意:后⾯的修改全部都是基于此类的修改在这⾥插⼊代码⽚
编写 l 配置⽂件
编写⼀个 AccountService 接⼝,后⾯的三种⽅法都要实现该接⼝
编写 AccountServiceImpl 实现该接⼝,并且记住该类的名称和位置
编写⼀个 Client 类,⽤来测试该接⼝中的⽅法
xmlns:xsi="/2001/XMLSchema-instance"
xmlns:context="/schema/context"
xsi:schemaLocation="/schema/beans
IAccountService 接⼝编写
package com.itheima.service;
public interface IAccountService {
void saveAccount();
}
IAccountServceImpl 接⼝实现类的编写
resource和autowired注解的区别package com.itheima.service.impl;
import com.itheima.service.IAccountService;
import java.util.Date;
/**
* 账户业务层的实现类
* 构造函数的注⼊
* */
public class IAccountServceImpl implements IAccountService {
// 经常变化的数据,并不适⽤于注⼊的⽅式
private String name;
private Integer age;
private Date birthday;
// 创建有参的构造⽅法,这个⽅法必须存在, 在xml中,数据就是通过有参的构造⽅法擦混⼊的
public IAccountServceImpl(String name, Integer age, Date birthday) {
this.name = name;
this.age = age;
this.birthday = birthday;
}
public IAccountServceImpl() {
System.out.println("对象创建了");
}
public void saveAccount() {
System.out.println("service 中的 saveAccount ⽅法执⾏了"+this.name + " "+ this.age + " " + this.birthday); }
@Override
public String toString() {
return "IAccountServceImpl{" +
"name='" + name + '\'' +
", age=" + age +
", birthday=" + birthday +
'}';
}
}
Client 类的编写
package com.itheima.client;
import com.itheima.service.IAccountService;
import t.ApplicationContext;
import t.support.ClassPathXmlApplicationContext;
/**
* 模拟⼀个表现层,⽤于调⽤业务层
* */
public class Client {
public static void main(String[] args) {
// 使⽤ mvc 三层架构,编写 (耦合性过⾼)
// IAccountService as = new IAccountServceImpl();
// =============== 划重点 ===============
// 1. 获取核⼼容器对象
ApplicationContext ac = new ClassPathXmlApplicationContext("l");
// ApplicationContext ac = new FileSystemXmlApplicationContext("xxx"); // 这⾥填写配置⽂件,在你本机上的物理地址,很少⽤户
// 2. 根据 id 获取 Bean 对象 (⽅式⼀)
IAccountService as = (IAccountService) ac.getBean("accountService");
System.out.println(as);
as.saveAccount();
//2. 根据 id 获取 Bean 对象 (⽅式⼆)
// IAccountDao adao = ac.getBean("accountDao", IAccountDao.class);
// as.saveAccount();
// System.out.println(adao);
}
}
运⾏结果:
我们没有使⽤ 传统的⽅式,接⽤ Spring 框架完成了 bean 的实例化
2.2 使⽤ setter 完成注⼊
2.2.1 使⽤ setter 完成依赖注⼊的功能
涉及的标签:property
出现的位置:bean 标签的内部
标签的属性:
name:⽤于指定注⼊时所⽤的 set ⽅法名称
== 以上三个⽤于指定给构造函数中哪个参数赋值 ==
value: ⽤于给基本类型和 String类型的数据
ref:⽤于指定其它的 bean 类型数据,它指的就是 spring IOC 核⼼容器中出现过的 bean 对象
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论