本文共 9408 字,大约阅读时间需要 31 分钟。
IOC
[网页]解决程序之间的依赖关系,降低耦合private IAccountDao accountDao= new AccountDaoImpl(); //IOC private IAccountDao accountDao = (IAccountDao) BeanFactory.getBean("accountDao");
(红色箭头:想它索取,蓝色箭头:给予它)
SpEL
IOC
解耦需要的配置文件,及给定的beanpackage 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
的使用(获取对象的类型)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执行了"); }}
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); }}
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 }}
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执行了"); }}
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); }}
aaa bbb ccc
aaa bbb ccc aaa bbb ccc CCC DDD
package com.lyc.service.impl;public class AccountServiceImpl3 implements IAccountService { private String[] myString; private ListmyList; 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/