博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
spring框架的 IOC翻转控制 | 解决程序之间的依赖关系,降低耦合
阅读量:3959 次
发布时间:2019-05-24

本文共 9408 字,大约阅读时间需要 31 分钟。

IOC[网页]解决程序之间的依赖关系,降低耦合

private IAccountDao accountDao= new AccountDaoImpl();    //IOC    private IAccountDao accountDao = (IAccountDao) BeanFactory.getBean("accountDao");

(红色箭头:想它索取,蓝色箭头:给予它)

文章目录

1、导坐标

  • Beans
  • Core
  • Context
  • SpEL

一、IOC解耦需要的配置文件,及给定的bean

package com.lyc.dao.impl;import com.lyc.dao.IAccountDao;public class AccountDaoImpl implements IAccountDao {
public void saveAccount() {
System.out.println("假设这是持久层的某保存方法"); }}
package com.lyc.dao;//持久层接口public interface IAccountDao {
void saveAccount();}
package com.lyc.service.impl;import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;public class AccountServiceImpl implements IAccountService {
//业务层调用持久层 private int i=1; private IAccountDao ad= new AccountDaoImpl(); public void saveAccount() {
System.out.println("第"+i+"次,业务层实现类,保存功能"); ad.saveAccount(); i++; } //这个称为默认构造函数,或者不写,如果你的配置文件是需要默认构造函数,
// 而实际上没有的话,就会如下面这样 报错//Failed to instantiate [com.lyc.service.impl.AccountServiceImpl]: No default constructor found;// public AccountServiceImpl() {
// System.out.println("AccountServiceImpl的对象被创建了");// }}
package com.lyc.service;public interface IAccountService {
void saveAccount();}
package com.lyc.ui;import com.lyc.service.impl.AccountServiceImpl;import javafx.application.Application;import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;public class Client {
/** * ApplicationContext的三个常用实现类: * ClassPathXmlApplicationContext:它可以加载类路径(resources)下的配置文件,要求配置文件必须在类路径下,不在的话加载不了 * FileSystemXmlApplicationContext:它可以加载磁盘任意路径下的配置文件(在有访问权限的情况下) * AnnotationConfigApplicationContext:它是用于读取注解创建容器的。 * 核心容器的两个接口引发出的问题 * ApplicationContext: 单例对象适用 * 它在构建核心容器时,创建对象采取的策略是‘立即加载‘的方式,也即是说,只要一读取完配置文件,就马上创建配置文件中配置的对象 * BeanFactory: 多例对象适用 * 它在构建核心内容时,创建对象采用的策略是’延迟加载‘的方式,什么时候根据id获取对象了,什么时候才真正创建对象 */ //模拟一个表现层,用来调用业务层// 获取spring容器的IOC核心容器。并根据id获取对象 public static void main(String[] args) {
//使用IOC //0、配置文件bean.xml 的准备 //1、获取核心容器 ApplicationContext ac=new ClassPathXmlApplicationContext("bean.xml");//此处如果不是放在resources下的,则要写上路径 //也可以换成下面这种磁盘路径的 //ApplicationContext ac=new FileSystemXmlApplicationContext("D:\\project\\day01_eesy_03spring\\src\\main\\resources\\bean.xml"); //2、根据id获取bean对象 IAccountService as=(IAccountService)ac.getBean("accountService"); //强转Object类型为IAccountDao类型 IAccountDao ad=ac.getBean("accountDao",IAccountDao.class); //给一个IAccountDao.class字节码,让它自己给我强转Object类型为我要的IAccountDao类型 System.out.println(as); System.out.println(ad); }}

二、对于配置文件bean.xml的使用(获取对象的类型)

1、bean对应的类是一个默认构造的函数

2、bean对应的类是一个普通方法

package com.lyc.ui;public class Client {
public static void main(String[] args) {
//0、配置文件bean.xml 的准备 //1、获取核心容器 ApplicationContext ac=new ClassPathXmlApplicationContext("bean.xml"); //2、根据id获取bean对象 IAccountService as=(IAccountService)ac.getBean("accountService"); System.out.println(as); }}
package com.lyc.factory;/** * 模拟一个工厂类(该类可能是存在jar包中,无法通过修改原码的方式来提供构造函数) */public class InstanceFactory {
public IAccountService getAccountService(){
return new AccountServiceImpl(); }}
package com.lyc.service.impl;public class AccountServiceImpl implements IAccountService {
private int i=1;//用的默认构造 public AccountServiceImpl() {
System.out.println("AccountServiceImpl的对象被创建了"); } public void saveAccount() {
System.out.println("Service中的dao执行了"); }}

3、bean对应的类是一个静态方法

package com.lyc.factory;public class StaticFactory {
public static IAccountService getAccountService(){
return new AccountServiceImpl();//调用构造函数 }}
package com.lyc.ui;public class Client {
public static void main(String[] args) {
//0、配置文件bean.xml 的准备 //1、获取核心容器 ApplicationContext ac=new ClassPathXmlApplicationContext("bean.xml"); //2、根据id获取bean对象 IAccountService as=(IAccountService)ac.getBean("accountService"); System.out.println(as); }}

三、bean对象的作用范围(单例 / 多例)

package com.lyc.ui;public class Client {
public static void main(String[] args) {
//0、配置文件bean.xml 的准备 //1、获取核心容器 ApplicationContext ac=new ClassPathXmlApplicationContext("bean.xml"); //此处如果不是放在resources下的,则要上路径 //2、根据id获取bean对象 IAccountService as=(IAccountService)ac.getBean("accountService"); IAccountService as1=(IAccountService)ac.getBean("accountService"); System.out.println(as == as1); //得到的结果调用两次方法,打印fasle }}

四、bean的生命周期

package com.lyc.service.impl;public class AccountServiceImpl implements IAccountService {
private int i=1; public AccountServiceImpl() {
System.out.println("AccountServiceImpl的对象被创建了"); } public void initAccount() {
System.out.println("对象初始化了"); } public void destroy() {
System.out.println("对象销毁了"); } public void saveAccount() {
System.out.println("Service中的dao执行了"); }}

五、spring的依赖注入

1、使用构造函数提供

2、使用set方法提供

package com.lyc.ui;public class Client {
public static void main(String[] args) {
//0、配置文件bean.xml 的准备 //1、获取核心容器 ApplicationContext ac=new ClassPathXmlApplicationContext("bean.xml"); //2、根据id获取bean对象 IAccountService as=(IAccountService)ac.getBean("accountService2"); as.saveAccount(); }}
package com.lyc.service.impl;public class AccountServiceImp2 implements IAccountService {
//如果是经常变化的数据,并不适用于注入的方式,bean.xml中的数据不应该经常变化 //字符串 private String name; //基本类型 private Integer age; //其他bean类型 private Date birthdate;//util//set注入只需要属性所有的set方法 public void setName(String name) {
this.name = name; } public void setAge(Integer age) {
this.age = age; } public void setBirthdate(Date birthdate) {
this.birthdate = birthdate; } public void saveAccount() {
System.out.println("Service中的dao执行了"+name+", "+age+", "+birthdate); }}

3、使用注解提供

aaa
bbb
ccc
aaa
bbb
ccc
aaa
bbb
ccc
BBB
CCC
DDD
package com.lyc.service.impl;public class AccountServiceImpl3 implements IAccountService {
private String[] myString; private List
myList; private Set
mySet; private Map
myMap; private Properties myProps; public void setMyString(String[] myString) {
this.myString = myString; } public void setMyList(List
myList) {
this.myList = myList; } public void setMySet(Set
mySet) {
this.mySet = mySet; } public void setMyMap(Map
myMap) { this.myMap = myMap; } public void setMyProps(Properties myProps) { this.myProps = myProps; } public void saveAccount() { System.out.println(Arrays.toString(myString)); //如果不用toString则打印的不是内容 System.out.println(myList); System.out.println(mySet); System.out.println(myMap); System.out.println(myProps); }}
package com.lyc.ui;public class Client {
public static void main(String[] args) {
//0、配置文件bean.xml 的准备 //1、获取核心容器 ApplicationContext ac=new ClassPathXmlApplicationContext("bean.xml"); //2、根据id获取bean对象 IAccountService as=(IAccountService)ac.getBean("accountService3"); as.saveAccount(); }}

qq_2405310636的博客:qq同号,如有疑问,可联系我。创作不易,引用请注明出处。

转载地址:http://attzi.baihongyu.com/

你可能感兴趣的文章
POJ1458---(最长公共子序列最基础题)
查看>>
POJ3356---(最长公共子序列)
查看>>
二叉树基础知识大全(核心理解遍历)
查看>>
03-树1 树的同构(25 分) 2017秋 数据结构 陈越、何钦铭
查看>>
04-树4 是否同一棵二叉搜索树(25 分)---陈越、何钦铭-数据结构-2017秋
查看>>
表达式求值(C实现,实现多括号,浮点数)---栈的实现以及运用。
查看>>
有序链表的合并(数据结构---单链表)
查看>>
栈实现(数据结构---数组,链表 C实现)
查看>>
POJ3903(dp,最长上升子序列,最基础题)
查看>>
POJ1836-Alignment(最长上升子序列)
查看>>
POJ1062昂贵的聘礼(Dijkstra+限制)
查看>>
POJ 2485 Highways(最小生成树,基础模板题)
查看>>
POJ 1251 Jungle Roads(最小生成树简单题)
查看>>
Floyd算法---模板
查看>>
HDU 1690---Bus System(Floyd模板题+合理定义INF)
查看>>
POJ3660---Cow Contest(Floyd,传递闭包,连通)
查看>>
POJ 2240---Arbitrage(Floyd的dp思想)
查看>>
Dijkstra算法---模板
查看>>
拓扑排序
查看>>
POJ 3680(费用流)
查看>>