与狗狗做网站互联网广告价格
news/
2025/9/24 19:45:43/
文章来源:
与狗狗做网站,互联网广告价格,注册域名要钱吗,无锡做网站品牌公司创建工程#xff1a; 2.1.程序的耦合 耦合#xff1a;耦合指的就是对象之间的依赖关系。对象之间的耦合越高#xff0c;维护成本越高。 案例#xff1a;没有引入IOC容器时系统的Web层、业务层、持久层存在耦合 /*** 持久层实现类*/
public class UserDaoImpl implements U…创建工程 2.1.程序的耦合 耦合耦合指的就是对象之间的依赖关系。对象之间的耦合越高维护成本越高。 案例没有引入IOC容器时系统的Web层、业务层、持久层存在耦合 /*** 持久层实现类*/
public class UserDaoImpl implements UserDao {Overridepublic void addUser(){System.out.println(insert into tb_user......);}
}/*** 业务层实现类*/
public class UserServiceImpl implements UserService {//硬编码此处有依赖关系private UserDao userDao new UserDaoImpl();public void addUser(){userDao.addUser();}
}/*** 模拟表现层*/
public class Client {public static void main(String[] args) {//硬编码此处有依赖关系UserService userService new UserServiceImpl();userService.addUser();}
}问题分析 上边的代码service层在依赖dao层的实现类此时如果更改dao了层的实现类或此时没有dao层实现类编译将不能通过。 IOC(工厂模式)解耦 把所有的dao和service对象使用配置文件配置起来当服务器启动时读取配置文件把这些对象通过反射创建出来并保存在容器中在使用的时候直接从工厂拿
2.2.工程模式的IOC解决程序耦合
2.2.2.什么是IOC IOC (Inverse of Control)即控制反转正传是自己创建依赖对象反正是有IOC工厂来创建依赖对象 原来 我们在获取对象时都是采用new的方式。是主动的。 现在
我们获取对象时同时跟工厂要有工厂为我们查找或者创建对象。是被动的。
这种被动接收的方式获取对象的思想就是控制反转它是spring框架的核心之一。
2.2.3.工厂模式的IOC解耦 案例一 /*** bean工厂*/
public class BeanFactory_v1 {/*** 获得UserServiceImpl对象* return*/public static UserService getUserService(){return new UserServiceImpl();}/*** 获得UserDaoImpl对象* return*/public static UserDao getUserDao(){return new UserDaoImpl();}
}问题我们在开发中会有很多个service和dao此时工厂类就要添加无数个方法。 案例二 #1、配置要使用的dao和service
UserDaocom.by.dao.UserDaoImpl
UserServicecom.by.service.UserServiceImpl/*** bean工厂*/
public class BeanFactory_v2 {private static Properties prop new Properties();/*** 根据全类名获取bean对象* param beanName* return* throws ClassNotFoundException*/public static Object getBean(String beanName) {try {//不能使用web工程发布后没有src目录//InputStream is new FileInputStream(src/bean.properties);InputStream is BeanFactory_v2.class.getClassLoader().getResourceAsStream(bean.properties);prop.load(is);return Class.forName(prop.getProperty(beanName)).newInstance();} catch (Exception e) {e.printStackTrace();}return null;}public static void main(String[] args) {System.out.println(prop.get(UserService));System.out.println(getBean(UserService));}
}/*** 业务层实现类*/
public class UserServiceImpl implements UserService {private UserDao userDao (UserDao) BeanFactory.getBean(UserDao);public void addUser(){userDao.addUser();}
}测试 /*** 模拟表现层*/
public class Client {public static void main(String[] args) {//直接引用接口实现类for (int i 0; i 5; i) {UserService userService (UserService)BeanFactory.getBean(UserService);System.out.println(userService);}}
}问题 每次都会创建新的对象程序运行时才创建对象(读取配置文件) 案例三 package com.by.factory;import java.io.InputStream;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;
import java.util.Set;/*** bean工厂*/
public class BeanFactory_v3 {//定义一个容器用于存放对象private static MapString, Object beans new HashMap();/*** 加载配置文件*/static {try {//2、读取配置文件//不能使用web工程发布后没有src目录//InputStream is new FileInputStream(src/bean.properties);InputStream is BeanFactory_v3.class.getClassLoader().getResourceAsStream(bean.properties);//3、通过反射创建对象,把对象存到容器中Properties prop new Properties();prop.load(is);SetMap.EntryObject, Object entrySet prop.entrySet();for (Map.EntryObject, Object entry : entrySet) {String key entry.getKey().toString();String beanName entry.getValue().toString();Object value Class.forName(beanName).newInstance();beans.put(key, value);}} catch (Exception e) {e.printStackTrace();}}/*** 4、在使用的时候直接从工厂拿* param beanName* return*/public static Object getBean(String beanName) {try {return beans.get(beanName);} catch (Exception e) {e.printStackTrace();}return null;}public static void main(String[] args) {System.out.println(getBean(UserService));}
}2.3.Spring的IOC解决程序耦合
2.3.1.创建工程 2.3.1.1.pom.xml
?xml version1.0 encodingUTF-8?
project xmlnshttp://maven.apache.org/POM/4.0.0xmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsdmodelVersion4.0.0/modelVersiongroupIdcom.by/groupIdartifactIdSpring_IOC_Xml/artifactIdversion1.0-SNAPSHOT/versionproperties!-- 项目源码及编译输出的编码 --project.build.sourceEncodingUTF-8/project.build.sourceEncodingproject.reporting.outputEncodingUTF-8/project.reporting.outputEncoding!-- 项目编译JDK版本 --maven.compiler.source8/maven.compiler.sourcemaven.compiler.target8/maven.compiler.target/propertiesdependencies!-- Spring常用依赖 --dependencygroupIdorg.springframework/groupIdartifactIdspring-context/artifactIdversion5.1.8.RELEASE/version/dependency/dependencies
/project注意Jar包彼此存在依赖只需引入最外层Jar即可由Maven自动将相关依赖Jar引入到项目中。
Spring常用功能的Jar包依赖关系
|
核心容器由 beans、core、context 和 expressionSpring Expression LanguageSpEL4个模块组成。
spring-beans和spring-core模块是Spring框架的核心模块包含了控制反转Inversion of ControlIOC和依赖注入Dependency InjectionDI。BeanFactory使用控制反转对应用程序的配置和依赖性规范与实际的应用程序代码进行了分离。BeanFactory属于延时加载也就是说在实例化容器对象后并不会自动实例化Bean只有当Bean被使用时BeanFactory才会对该 Bean 进行实例化与依赖关系的装配。spring-context模块构架于核心模块之上扩展了BeanFactory为它添加了Bean生命周期控制、框架事件体系及资源加载透明化等功能。此外该模块还提供了许多企业级支持如邮件访问、远程访问、任务调度等ApplicationContext 是该模块的核心接口它的超类是 BeanFactory。与BeanFactory不同ApplicationContext实例化后会自动对所有的单实例Bean进行实例化与依赖关系的装配使之处于待用状态。spring-expression 模块是统一表达式语言EL的扩展模块可以查询、管理运行中的对象同时也可以方便地调用对象方法以及操作数组、集合等。它的语法类似于传统EL但提供了额外的功能最出色的要数函数调用和简单字符串的模板函数。EL的特性是基于Spring产品的需求而设计的可以非常方便地同Spring IoC进行交互。
2.3.1.2.dao
/*** 持久层实现类*/
public class UserDaoImpl implements UserDao {Overridepublic void addUser(){System.out.println(insert into tb_user......);}
}2.3.1.3.service
/*** 业务层实现类*/
public class UserServiceImpl implements UserService {//此处有依赖关系private UserDao userDao new UserDaoImpl();public void addUser(){userDao.addUser();}
}2.3.2.IOC
2.3.2.1.applicationContext.xml
?xml version1.0 encodingUTF-8?
!--1、注意要导入schema约束--
beans xmlnshttp://www.springframework.org/schema/beansxmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd!--2、把对象交给spring来创建id给对象在容器中提供一个唯一标识。用于获取对象 class指定类的全限定类名。用于反射创建对象。默认情况下调用无参构造函数--bean iduserDao classcom.by.dao.UserDaoImpl/beanbean iduserService classcom.by.service.UserServiceImpl/bean
/beans注意命名无限制约定俗成命名有spring-context.xml、applicationContext.xml、beans.xml
2.3.2.2.测试
/*** 模拟表现层*/
public class Client {public static void main(String[] args) {//1.使用ApplicationContext接口就是在获取spring容器ApplicationContext ac new ClassPathXmlApplicationContext(applicationContext.xml);//2.根据bean的id获取对象UserDao userDao (UserDao) ac.getBean(userDao);System.out.println(userDao);UserService userService (UserService) ac.getBean(userService);System.out.println(userService);userService.addUser();}
}问题service层仍然耦合
2.3.3.DI
概述DIDependency Injection依赖注入将依赖对象从容器中拿出来赋值给调用者
2.3.3.1.构造函数注入
顾名思义就是使用类中的构造函数给成员变量赋值。注意赋值的操作不是我们自己做的而是通过配置的方式让spring框架来为我们注入。具体代码如下
/*** 业务层实现类*/
public class UserServiceImpl implements UserService {private UserDao userDao;private String name;private Integer age;public UserServiceImpl(UserDao userDao, String name, Integer age) {this.userDao userDao;this.name name;this.age age;}public void addUser(){System.out.println(name,age);userDao.addUser();}
}?xml version1.0 encodingUTF-8?
!--1、注意要导入schema约束--
beans xmlnshttp://www.springframework.org/schema/beansxmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd!--2、把对象交给spring来创建--bean iduserDao classcom.by.dao.UserDaoImpl/beanbean iduserService classcom.by.service.UserServiceImpl!--要求类中需要提供一个对应参数列表的构造函数。标签constructor-arg给谁赋值:index:指定参数在构造函数参数列表的索引位置name:指定参数在构造函数中的名称赋什么值:value:它能赋的值是基本数据类型和String类型ref:它能赋的值是其他bean类型也就是说必须得是在配置文件中配置过的bean--constructor-arg nameuserDao refuserDao/constructor-argconstructor-arg namename value张三/constructor-argconstructor-arg nameage value18/constructor-arg/bean
/beans2.3.3.2.set方法注入
顾名思义就是在类中提供需要注入成员的set方法。具体代码如下
/*** 业务层实现类*/
public class UserServiceImpl implements UserService {private UserDao userDao;private String name;private Integer age;public void setUserDao(UserDao userDao) {this.userDao userDao;}public void setName(String name) {this.name name;}public void setAge(Integer age) {this.age age;}public void addUser(){System.out.println(name,age);userDao.addUser();}
}?xml version1.0 encodingUTF-8?
!--1、注意要导入schema约束--
beans xmlnshttp://www.springframework.org/schema/beansxmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd!--2、把对象交给spring来创建--bean iduserDao classcom.by.dao.UserDaoImpl/beanbean iduserService classcom.by.service.UserServiceImpl!--要求property标签constructor-arg给谁赋值:name:找的是类中set方法后面的部分赋什么值:value:它能赋的值是基本数据类型和String类型ref:它能赋的值是其他bean类型也就是说必须得是在配置文件中配置过的bean--property nameuserDao refuserDao/propertyproperty namename value张三/propertyproperty nameage value18/property/bean
/beans2.3.3.3.自动注入
不用在配置中 指定为哪个属性赋值由spring自动根据某个 “原则” 在工厂中查找一个bean并为属性注入值。具体代码如下
/*** 业务层实现类*/
public class UserServiceImpl implements UserService {private UserDao userDao;public void setUserDao(UserDao userDao) {this.userDao userDao;}public void addUser(){userDao.addUser();}
}?xml version1.0 encodingUTF-8?
!--1、注意要导入schema约束--
beans xmlnshttp://www.springframework.org/schema/beansxmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd!--2、把对象交给spring来创建--bean iduserDao classcom.by.dao.UserDaoImpl/bean!--autowirebyType按照类型自动注入值--bean iduserService classcom.by.service.UserServiceImpl autowirebyType/bean
/beans?xml version1.0 encodingUTF-8?
!--1、注意要导入schema约束--
beans xmlnshttp://www.springframework.org/schema/beansxmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd!--2、把对象交给spring来创建--bean iduserDao classcom.by.dao.UserDaoImpl/bean!--autowirebyType按照类型自动注入值--bean iduserService classcom.by.service.UserServiceImpl autowirebyName/bean
/beans2.3.3.4.注入集合类型的属性
顾名思义就是给类中的集合成员传值它用的也是set方法注入的方式只不过变量的数据类型都是集合。我们这里介绍注入数组List,Set,Map。具体代码如下
/*** 业务层实现类*/
public class UserServiceImpl implements UserService {private UserDao userDao;private String[] myStrs;private ListString myList;private SetString mySet;private MapString,String myMap;public void setUserDao(UserDao userDao) {this.userDao userDao;}public void setMyStrs(String[] myStrs) {this.myStrs myStrs;}public void setMyList(ListString myList) {this.myList myList;}public void setMySet(SetString mySet) {this.mySet mySet;}public void setMyMap(MapString, String myMap) {this.myMap myMap;}public void addUser(){System.out.println(Arrays.toString(myStrs));System.out.println(myList);System.out.println(mySet);System.out.println(myMap);userDao.addUser();}
}?xml version1.0 encodingUTF-8?
!--1、注意要导入schema约束--
beans xmlnshttp://www.springframework.org/schema/beansxmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd!--2、把对象交给spring来创建--bean iduserDao classcom.by.dao.UserDaoImpl/beanbean iduserService classcom.by.service.UserServiceImpl!--要求property标签constructor-arg给谁赋值:name:找的是类中set方法后面的部分赋什么值:value:它能赋的值是基本数据类型和String类型ref:它能赋的值是其他bean类型也就是说必须得是在配置文件中配置过的bean--property nameuserDao refuserDao/property!-- 给mySet集合注入数据 --property namemySetsetvalueAAA/valuevalueBBB/valuevalueCCC/value/set/property!-- 注入array数组数据 --property namemyArrayarrayvalueAAA/valuevalueBBB/valuevalueCCC/value/array/property!-- 注入list集合数据 --property namemyListlistvalueAAA/valuevalueBBB/valuevalueCCC/value/list/property!-- 注入Map数据 --property namemyMapmapentry keytestA valueaaa/entryentry keytestB valuebbb/entry/map/property/bean
/beans2.4.Spring中的工厂类
2.4.1.ApplicationContext ApplicationContext的实现类如下图 ClassPathXmlApplicationContext加载类路径下 Spring 的配置文件FileSystemXmlApplicationContext加载本地磁盘下 Spring 的配置文件
2.4.2.BeanFactory spring中工厂的类结构图 区别 ApplicationContext只要一读取配置文件默认情况下就会创建对象。 /*** 业务层实现类*/
public class UserServiceImpl implements UserService {private UserDao userDao;public UserServiceImpl() {System.out.println(UserServiceImpl对象创建了...);}public void setUserDao(UserDao userDao) {this.userDao userDao;}public void addUser(){userDao.addUser();}
}/*** 模拟表现层*/
public class Client {public static void main(String[] args) {new ClassPathXmlApplicationContext(applicationContext.xml);System.out.println(Spring IOC容器创建好了);}
}BeanFactory是在 getBean 的时候才会创建对象。 /*** 业务层实现类*/
public class UserServiceImpl implements UserService {private UserDao userDao;public UserServiceImpl() {System.out.println(UserServiceImpl对象创建了...);}public void setUserDao(UserDao userDao) {this.userDao userDao;}public void addUser(){userDao.addUser();}
}/**
* 模拟表现层
*/
public class Client {public static void main(String[] args) {new XmlBeanFactory(new ClassPathResource(applicationContext.xml));System.out.println(Spring IOC容器创建好了);}
}2.5.bean的作用范围
2.5.1.概述
在Spring中bean作用域用于确定bean实例应该从哪种类型的Spring容器中返回给调用者。
2.5.2.五种作用域 目前Spring Bean的作用域或者说范围主要有五种 作用域说明singleton默认值Bean以单例方式存在spring IoC容器prototype每次从容器中调用Bean时都返回一个新的实例相当于执行newInstance()requestWEB 项目中Spring 创建一个 Bean 的对象,将对象存入到 request 域中sessionWEB 项目中Spring 创建一个 Bean 的对象,将对象存入到 session 域中applicationWEB 项目中Spring 创建一个 Bean 的对象,将对象存入到 ServletContext 域中 可以通过 bean 标签的scope 属性控制bean的作用范围其配置方式如下所示 bean id... class... scopesingleton/需要根据场景决定对象的单例、多例模式 单例Service、DAO、SqlSessionFactory或者是所有的工厂 多例Connection、SqlSession
2.6.bean的生命周期
2.6.1.单例bean 案例 bean iduserService classcom.by.service.UserServiceImplscopesingleton init-methodinit destroy-methoddestroy/*** 业务层实现类*/
public class UserServiceImpl implements UserService {private UserDao userDao;public UserServiceImpl() {System.out.println(调用构造方法创建bean...);}public void setUserDao(UserDao userDao) {System.out.println(调用set方法注入值...);this.userDao userDao;}public void init(){System.out.println(调用init方法初始化bean...);}public void destroy(){System.out.println(调用destroy方法销毁bean...);}public void addUser(){userDao.addUser();}
}/*** 模拟表现层*/
public class Client {public static void main(String[] args) {ClassPathXmlApplicationContext ac new ClassPathXmlApplicationContext(applicationContext.xml);//关闭容器ac.close();}
}生命周期 [容器启动]—构造方法(实例化)—set方法(注入)—init方法(初始化)—[容器关闭]—destroy方法(销毁)
2.5.2.多例bean 案例 bean iduserService classcom.by.service.UserServiceImplscopeprototype init-methodinit destroy-methoddestroy/*** 业务层实现类*/
public class UserServiceImpl implements UserService {private UserDao userDao;public UserServiceImpl() {System.out.println(调用构造方法创建bean...);}public void setUserDao(UserDao userDao) {System.out.println(调用set方法注入值...);this.userDao userDao;}public void init(){System.out.println(调用init方法初始化bean...);}public void destroy(){System.out.println(调用destroy方法销毁bean...);}public void addUser(){userDao.addUser();}
}/*** 模拟表现层*/
public class Client {public static void main(String[] args) {ClassPathXmlApplicationContext ac new ClassPathXmlApplicationContext(applicationContext.xml);//使用对象ac.getBean(userService);}
}生命周期 [使用对象]----构造方法(实例化)—set方法(注入)—init方法(初始化)—[JVM垃圾回收]—destroy方法(销毁)
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/916156.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!