个人房产信息查询网站,无锡网站推广经理,深圳关键词推广排名,个人博客网页模板图片文章目录 一、Spring Framework系统框架二、IoC控制反转 与 DI依赖注入 简单入门三、Bean3.1 Bean的配置3.2 实例化Bean的四种方式3.3 Bean的生命周期 四、依赖注入4.1 setter注入4.2 构造器注入4.3 注入方式选择4.4 依赖自动装配4.5 集合注入4.6 案例#xff1a;配置数据库4.… 文章目录 一、Spring Framework系统框架二、IoC控制反转 与 DI依赖注入 简单入门三、Bean3.1 Bean的配置3.2 实例化Bean的四种方式3.3 Bean的生命周期 四、依赖注入4.1 setter注入4.2 构造器注入4.3 注入方式选择4.4 依赖自动装配4.5 集合注入4.6 案例配置数据库4.7、加载Properties文件 五、容器总结六、注解开发模式【替代上述配置文件方式】6.1 Java类【SpringConfig.java】替代配置文件【applicationContext.xml】6.2 注解开发bean6.3 加载配置文件6.4 bean的生命周期6.5 依赖注入-自动装配与加载Properties文件6.6 管理第三方bean6.7 XML配置与注解配置比较6.8 Spring整合mybatis6.9 Spring整合Junit 一、Spring Framework系统框架 二、IoC控制反转 与 DI依赖注入 简单入门 在pom.xml导入依赖
dependenciesdependencygroupIdorg.springframework/groupIdartifactIdspring-context/artifactIdversion5.2.10.RELEASE/version/dependency
/dependencies使用 IoC 与 DI 目的applicationContext.xmlSpring的配置文件中实现bean与bean依赖关系即DI依赖注入将创建new一个对象的权限交给Ioc容器即配置文件。 applicationContext.xml 目的配置bean以及添加依赖注入的配置
?xml version1.0 encodingUTF-8?
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!--1.导入spring的坐标spring-context对应版本是5.2.10.RELEASE--!--2.配置bean--!--bean标签标示配置beanid属性标示给bean起名字class属性表示给bean定义类型--bean idbookDao classcom.itheima.dao.impl.BookDaoImpl/bean idbookService classcom.itheima.service.impl.BookServiceImpl!--7.配置server与dao的关系--!--property标签表示配置当前bean的属性name属性表示配置哪一个具体的属性:BookServiceImpl类的bookDao属性ref属性表示参照哪一个bean: applicationContext.xml中的id为bookDao的bean--property namebookDao refbookDao//bean/beansAPP2.java 目的获取IoC容器从容器中获取对象进行方法调用
public class App2 {public static void main(String[] args) {//3.获取IoC容器ApplicationContext ctx new ClassPathXmlApplicationContext(applicationContext.xml);//4.获取bean根据bean配置id获取
// BookDao bookDao (BookDao) ctx.getBean(bookDao);
// bookDao.save();BookService bookService (BookService) ctx.getBean(bookService);bookService.save();}
}BookServiceImpl.java 注意要删除业务层的new并且为属性提供setter方法
public class BookServiceImpl implements BookService {//5.删除业务层中使用new的方式创建的dao对象private BookDao bookDao;public void save() {System.out.println(book service save ...);bookDao.save();}//6.提供对应的set方法public void setBookDao(BookDao bookDao) {this.bookDao bookDao;}
}BookDaoImpl.java
public class BookDaoImpl implements BookDao {public void save() {System.out.println(book dao save ...);}
}三、Bean
3.1 Bean的配置
基础配置
别名配置 作用范围配置 解释单例模式下访问同一个bean的地址是相同的非单例则相反
为什么bean默认为单例? bean为单例的意思是在Spring的IoC容器中只会有该类的一个对象bean对象只有一个就避免了对象的频繁创建与销毁达到了bean对象的复用性能高bean在容器中是单例的会不会产生线程安全问题? 如果对象是有状态对象即该对象有成员变量可以用来存储数据的因为所有请求线程共用一个bean对象所以会存在线程安全问题。 如果对象是无状态对象即该对象没有成员变量没有进行数据存储的因方法中的局部变量在方法调用完成后会被销毁所以不会存在线程安全问题。哪些bean对象适合交给容器进行管理? 表现层对象、业务层对象、数据层对象、工具对象哪些bean对象不适合交给容器进行管理? 封装实例的域对象因为会引发线程安全问题所以不适合 3.2 实例化Bean的四种方式 采用默认无参构造方法【默认常用】 通过静态工厂创建对象【了解】 通过实例工厂创建对象 通过FactoryBean创建对象【第三种的改良】【要求掌握】默认单例模式要改成多例模式实现FactoryBean的isSingleton() 方法将其设置为true
3.3 Bean的生命周期
bean其实就是一个对象bean的生命周期指的就是bean对象从创建到销毁的整体过程。bean生命周期控制就是在bean创建后到销毁前做一些事情。 方式一自定义init和destory方法 方式二接口配置【了解】
销毁bean的时机
四、依赖注入 4.1 setter注入 4.2 构造器注入 注意因为构造器注入 constructor-arg 的name属性匹配的是构造器的形参名耦合度过高可以使用type代表参数类型和index代表参数位置属性匹配参数
4.3 注入方式选择
强制依赖必须要new的参数使用构造器进行因为使用setter注入有概率不进行注入导致null对象出现强制依赖指对象在创建的过程中必须要注入指定的参数可选依赖使用setter注入进行灵活性强可选依赖指对象在创建过程中注入的参数可有可无Spring框架倡导使用构造器第三方框架内部大多数采用构造器注入的形式进行数据初始化相对严谨如果有必要可以两者同时使用使用构造器注入完成强制依赖的注入使用setter注入完成可选依赖的注入实际开发过程中还要根据实际情况分析别人提供提供setter方法就用setter注入提供构造器就使用构造器注入自己开发的模块推荐使用setter注入
4.4 依赖自动装配
IoC容器根据bean所依赖的资源在容器中自动查找并注入到bean中的过程称为自动装配。
自动装配方式有哪些?
按类型常用autowire“byType”按名称autowire“byName”按构造方法autowire“constructor”不启用自动装配autowire“no” 注意
自动装配用于引用类型依赖注入不能对简单类型进行操作使用按类型装配时byType必须保障容器中相同类型的bean唯一推荐使用使用按名称装配时byName必须保障容器中具有指定名称的bean因变量名与配置耦合不推荐使用自动装配优先级低于setter注入与构造器注入同时出现时自动装配配置失效
4.5 集合注入
前面我们已经能完成引用数据类型和简单数据类型的注入但是还有一种数据类型集合集合中既可以装简单数据类型也可以装引用数据类型对于集合在Spring中该如何注入呢? 先来回顾下常见的集合类型有哪些?数组、List、Set、Map、Properties
applicationContext.xml
?xml version1.0 encodingUTF-8?
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.xsdbean idbookDao classcom.itheima.dao.impl.BookDaoImpl!--数组注入--property namearray1arrayvalue100/valuevalue200/valuevalue300/value/array/property!--list集合注入--property namelist1listvalueitcast/valuevalueitheima/valuevalueboxuegu/valuevaluechuanzhihui/value/list/property!--set集合注入--property nameset1setvalueitcast/valuevalueitheima/valuevalueboxuegu/valuevalueboxuegu/value/set/property!--map集合注入--property namemap1mapentry keycountry valuechina/entry keyprovince valuehenan/entry keycity valuekaifeng//map/property!--Properties注入--property nameproperties1propsprop keycountrychina/propprop keyprovincehenan/propprop keycitykaifeng/prop/props/property/bean
/beans
BookDaoImpl
package com.itheima.dao.impl;import com.itheima.dao.BookDao;import java.util.*;public class BookDaoImpl implements BookDao {private int[] array1;private ListString list1;private SetString set1;private MapString,String map1;private Properties properties1;public void setArray(int[] array) {this.array1 array;}public void setList(ListString list) {this.list1 list;}public void setSet(SetString set) {this.set1 set;}public void setMap(MapString, String map) {this.map1 map;}public void setProperties(Properties properties) {this.properties1 properties;}public void save() {System.out.println(book dao save ...);System.out.println(遍历数组: Arrays.toString(array1));System.out.println(遍历List list1);System.out.println(遍历Set set1);System.out.println(遍历Map map1);System.out.println(遍历Properties properties1);}
}
4.6 案例配置数据库 4.7、加载Properties文件 applicationContext.xml
?xml version1.0 encodingUTF-8?
beans xmlnshttp://www.springframework.org/schema/beansxmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexmlns:contexthttp://www.springframework.org/schema/contextxsi:schemaLocation http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsd
!-- 1.开启context命名空间--!-- 2.使用context空间加载properties文件--context:property-placeholder locationjdbc.properties/!-- context:property-placeholder locationjdbc.properties system-properties-modeNEVER/--!-- context:property-placeholder locationjdbc.properties,jdbc2.properties system-properties-modeNEVER/--!-- classpath:*.properties 设置加载当前工程类路径中的所有properties文件--!-- system-properties-mode属性是否加载系统属性--!-- context:property-placeholder location*.properties system-properties-modeNEVER/--!--classpath*:*.properties 设置加载当前工程类路径和当前工程所依赖的所有jar包中的所有properties文件--!-- context:property-placeholder locationclasspath*:*.properties system-properties-modeNEVER/--!-- 3.使用属性占位符${}读取properties文件中的属性--!-- 说明idea自动识别${}加载的属性值需要手工点击才可以查阅原始书写格式--bean iddataSourse classcom.alibaba.druid.pool.DruidDataSourceproperty namedriverClassName value${jdbc.driver}/property nameurl value${jdbc.url}/property nameusername value${jdbc.username}/property namepassword value${jdbc.password}//bean/beansjdbc.properties
jdbc.drivercom.mysql.jdbc.Driver
jdbc.urljdbc:mysql://127.0.0.1:3306/spring_db
jdbc.usernameroot
jdbc.passwordroot五、容器总结
创建容器的两种方式 获取bean的三种方式 配置bean
依赖注入
六、注解开发模式【替代上述配置文件方式】
6.1 Java类【SpringConfig.java】替代配置文件【applicationContext.xml】 SpringConfig.java
// 声明当前类为Spring配置类
Configuration
// 设置bean扫描路径多个路径书写为字符串数组格式
ComponentScan({com.itheima.service,com.itheima.dao})
public class SpringConfig {
}6.2 注解开发bean 使用纯注解模式设置配置文件就可不用写context:component-san base-package
6.3 加载配置文件
AppForAnnotation.java
public class AppForAnnotation {public static void main(String[] args) {//AnnotationConfigApplicationContext加载Spring配置类初始化Spring容器ApplicationContext ctx new AnnotationConfigApplicationContext(SpringConfig.class);BookDao bookDao (BookDao) ctx.getBean(bookDao);System.out.println(bookDao);//按类型获取beanBookService bookService ctx.getBean(BookService.class);System.out.println(bookService);}
}6.4 bean的生命周期
Repository
//Scope设置bean的作用范围:singleton表示单例模式
Scope(singleton)
public class BookDaoImpl implements BookDao {public void save() {System.out.println(book dao save ...);}//PostConstruct设置bean的初始化方法PostConstructpublic void init() {System.out.println(init ...);}//PreDestroy设置bean的销毁方法PreDestroypublic void destroy() {System.out.println(destroy ...);}
}6.5 依赖注入-自动装配与加载Properties文件 6.6 管理第三方bean
在pom.xml中导入第三方库 dependencygroupIdcom.alibaba/groupIdartifactIddruid/artifactIdversion1.1.10/version/dependency定义一个配置类 创建一个方法用于要管理的对象使用**Bean**注解表示当前方法的返回类型是一个Bean简单类型使用Value对成员变量进行注入引用类型是自动注入但要写进方法的形参中
public class JdbcConfig {Value(com.jdbc.mysql.Driver)private String dirver;Value(jdbc:mysql://localhost:3306/mydb)private String url;Value(root)private String username;Value(root)private String password;Beanpublic DataSource dataSourse(BookDao bookDao){System.out.println(bookDao);DruidDataSource ds new DruidDataSource();ds.setDriverClassName(dirver);ds.setUrl(url);ds.setUsername(username);ds.setPassword(password);return ds;}
}在总配置类中导入 使用**Import注解导入自定义第三方配置类**
Configuration
// 设置bean扫描路径多个路径书写为字符串数组格式
ComponentScan({com.itheima.service,com.itheima.dao})
PropertySource(jdbc.properties)
Import({JdbcConfig.class})
public class SpringConfig {
}6.7 XML配置与注解配置比较 6.8 Spring整合mybatis
导入Spring整合mybatis的坐标【注意不同坐标的版本有对应关系】 dependencygroupIdorg.springframework/groupIdartifactIdspring-context/artifactIdversion5.2.10.RELEASE/version/dependencydependencygroupIdcom.alibaba/groupIdartifactIddruid/artifactIdversion1.1.16/version/dependencydependencygroupIdorg.mybatis/groupIdartifactIdmybatis/artifactIdversion3.5.6/version/dependencydependencygroupIdmysql/groupIdartifactIdmysql-connector-java/artifactIdversion5.1.47/version/dependency!-- 以下就是Spring整合mybatis的坐标--dependencygroupIdorg.springframework/groupIdartifactIdspring-jdbc/artifactIdversion5.2.10.RELEASE/version/dependencydependencygroupIdorg.mybatis/groupIdartifactIdmybatis-spring/artifactIdversion1.3.0/version/dependency配置jdbc的bean【DataSource】 JdbcConfig.java
public class JdbcConfig {Value(${jdbc.driver})private String driver;Value(${jdbc.url})private String url;Value(${jdbc.username})private String userName;Value(${jdbc.password})private String password;Beanpublic DataSource dataSource(){DruidDataSource ds new DruidDataSource();ds.setDriverClassName(driver);ds.setUrl(url);ds.setUsername(userName);ds.setPassword(password);return ds;}
}将xml配置文件改成注解形式即配置SqlSessionFactory与Mapper的bean【SqlSessionFactoryBean、MapperScannerConfigurer】 MybatisConfig.java
public class MybatisConfig {//定义beanSqlSessionFactoryBean用于产生SqlSessionFactory对象Beanpublic SqlSessionFactoryBean sqlSessionFactory(DataSource dataSource){SqlSessionFactoryBean ssfb new SqlSessionFactoryBean();ssfb.setTypeAliasesPackage(com.itheima.domain);// 这里的DataSource即第二步配置的bean,要写在方法的形参中,由系统自动装配ssfb.setDataSource(dataSource);return ssfb;}//定义bean返回MapperScannerConfigurer对象Beanpublic MapperScannerConfigurer mapperScannerConfigurer(){MapperScannerConfigurer msc new MapperScannerConfigurer();msc.setBasePackage(com.itheima.dao);return msc;}
}导入上述第三方bean
Configuration
ComponentScan(com.itheima)
//PropertySource加载类路径jdbc.properties文件
PropertySource(classpath:jdbc.properties)
Import({JdbcConfig.class,MybatisConfig.class})
public class SpringConfig {
}使用 其中关于操作数据的domain、dao、service省略
public class App2 {public static void main(String[] args) {ApplicationContext ctx new AnnotationConfigApplicationContext(SpringConfig.class);AccountService accountService ctx.getBean(AccountService.class);Account ac accountService.findById(1);System.out.println(ac);}
}6.9 Spring整合Junit
导入坐标 dependencygroupIdjunit/groupIdartifactIdjunit/artifactIdversion4.12/versionscopetest/scope/dependencydependencygroupIdorg.springframework/groupIdartifactIdspring-test/artifactIdversion5.2.10.RELEASE/version/dependency