宝塔做网站,网站注册域名备案,亚马逊电商平台官网,烟台网站建设方案报价一、Spring概述
Spring是一款主流的Java EE轻量级开源框架。 Spring的核心模块#xff1a;IoC#xff08;控制反转#xff0c;指把创建对象过程交给Spring管理 #xff09;、AOP#xff08;面向切面编程#xff0c;在不修改源代码的基础上增强代码功能#xff09;
二、…一、Spring概述
Spring是一款主流的Java EE轻量级开源框架。 Spring的核心模块IoC控制反转指把创建对象过程交给Spring管理 、AOP面向切面编程在不修改源代码的基础上增强代码功能
二、Spring入门
2.1 入门案例开发步骤
引入spring相关依赖创建类定义属性和方法按照spring要求创建配置文件在spring配置文件中配置相关信息进行测试
2.2 案例开发实例 创建一个spring maven项目名为Spring6再在Spring6下面创建一个名为Spring-first的模块在此模块下的pom.xml里增加依赖。
dependencies!-- 第2.1个spring context依赖(这是spring的基础依赖) --dependencygroupIdorg.springframework/groupIdartifactIdspring-context/artifactIdversion5.3.7/version!--如果是JDK17及以上的就写6.0.0版本--/dependency!--第2.2个spring junit依赖 --dependencygroupIdjunit/groupIdartifactIdjunit/artifactIdversion4.13.2/version
!-- scopetest/scope--/dependency/dependencies复制之后点击m小图标进行联网下载。
创建一个User类里面创建一个add方法。
public class User {public void add(){System.out.println(添加。。。);}
}创建一个bean.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.xsd!-- 完成user对象创建--
!-- id属性唯一标识--
!-- class属性要创建的对象所在类的全路径--bean iduser classcom.hbnu.spring6.User/
/beans再写一个测试类测试方法调用
public class TestUser {
//这里的注解要导入 import org.junit.Test;Testpublic void testUser(){//加载spring配置文件创建对象ApplicationContext applicationContextnew ClassPathXmlApplicationContext(bean.xml);//获取创建的对象User user (User) applicationContext.getBean(user);//getBean -- xml文件里的id值System.out.println(user);//使用对象调用方法进行测试user.add();}
}如果是利用反射创建对象呢
//利用反射创建对象public void testUserObject1() throws Exception {Class clazzClass.forName(com.hbnu.spring6.User);//调用方法创建对象User user (User) clazz.getDeclaredConstructor().newInstance();System.out.println(user);user.add();}三、容器IoC
IoC是Inversion of Control的简写译为”控制反转”是一种设计思想不是一种技术是一个重要的面向对象编程法则是Spring框架中最重要的核心组件之一。 Spring通过IoC容器来管理所有的Java对象的实例化和初始化控制对象与对象之间的依赖关系。我们将由IoC容器管理的Java对象称为Spring Bean它与new一个对象没有区别。
控制反转反转的是什么
将对象的创建权力交出去交给第三方容器负责将对象和对象之间关系的维护权交出去交给第三方容器负责
控制反转这种思想如何实现
DI 依赖注入
3.1 依赖注入 指Spring创建对象的过程中将对象依赖属性通过配置进行注入 常见方式包括两种
set注入构造注入
3.2 IoC容器在Spring的实现
IoC容器中管理的组件也叫做bean在创建bean之前首先要创建IoC容器。Spring提供了两种实现方式
BeanFactory 是IoC容器的基本实现是Spring内部使用的接口面向Spring本身不提供给开发人员
ApplicationContext 是BeanFactory的子接口提供了更多高级特性面向Spring的使用者
ApplicationContext的主要实现类
3.3 基于xml管理bean 1.获取bean xml文件里配置id值
bean iduser classcom.hbnu.spring6.User/①根据id获取
public void test1(){ApplicationContext acnew ClassPathXmlApplicationContext(bean.xml);User user (User) applicationContext.getBean(user);
}②根据id和类型获取
public void test2(){ApplicationContext acnew ClassPathXmlApplicationContext(bean.xml);User user applicationContext.getBean(user,User.class);
}③根据类型获取
public void test3(){ApplicationContext acnew ClassPathXmlApplicationContext(bean.xml);User user applicationContext.getBean(User.class);
}且当根据类型获取bean的时候要求ioc容器里指定类型class的bean只允许有一个配置了两个会报错。即下面两行是错的。
bean iduser classcom.hbnu.spring6.User/
bean iduser1 classcom.hbnu.spring6.User/注意①如果组件类实现了接口根据接口类型可以获取bean吗可以前提是bean唯一 ②如果一个接口有多个实现类这些实现类都配置了bean根据接口类型可以获取bean吗不行因为bean不唯一
以下是错误的
!-- 一个接口实现类获取过程--bean idUserDaoImpl classcom.hbnu.spring6.bean.UserDaoImpl/bean idPersonDaoImpl classcom.hbnu.spring6.bean.PersonDaoImpl/ApplicationContext applicationContextnew ClassPathXmlApplicationContext(bean.xml);UserDao userDao applicationContext.getBean(UserDao.class);System.out.println(userDao);userDao.run();2.依赖注入 如果是原生Javaset方法和构造器方法怎么注入 //set方法注入Book booknew Book();book.setAuthor(牛顿);//通过构造器注入Book book1new Book(1,鹤);接着看用配置文件如何注入。。。
①根据set方法注入 创建一个Book类定义属性生成属性set方法之后在spring配置文件里配置。。。
!-- 1.set方法完成注入--bean idbook classcom.hbnu.spring6.DI.Bookproperty namebname valuespring/property nameauthor value小唐//bean!--name对应Book类里面的属性--测试一下set方法注入
Testpublic void testSet(){ApplicationContext applicationContextnew ClassPathXmlApplicationContext(bean-DI.xml);Book book (Book)applicationContext.getBean(book);System.out.println(book);//Book{bnamespring, author小唐}}输出Book类里重写的toString
②根据构造器注入 创建一个Book类定义属性生成有参数的构造方法在spring配置文件里配置。。。
!-- 2.有参构造注入--bean idbookCons classcom.hbnu.pojo.Bookconstructor-arg nameauthor value小李/constructor-arg namename valueSpring学习之有参构造注入//bean测试跟上面一样只是配置文件里写的内容不一样了 3.特殊值处理 ①字面量赋值 ②null值 用null标签表示空值 ③xml实体 用lt;gt;表示大小尖括号 ④CDATA节 ![CDATA[ab]] 4.为对象类型属性赋值 创建两个类对象dept和emp 在emp类里写一个work方法
public class Emp {//对象类型属性员工属于某个部门private Dept dept;private String ename;private String age;public void work(){System.out.println(ename is working...);dept.info();}...}①引用外部bean 1.引用外部bean注入bean iddept classcom.hbnu.DITest.Deptproperty namedname value安保部//beanbean idemp classcom.hbnu.DITest.Emp
!-- 普通类型属性注入--property nameename valuelucy/property nameage value23/
!-- 对象类型属性注入--
!-- 表示引入外部bean这里的ref是上面id为dept的值--property namedept refdept//bean②使用内部bean
!-- 2.使用内部bean注入--bean idemp classcom.hbnu.DITest.Empproperty nameage value25/property nameename valuejoey/property namedeptbean iddept classcom.hbnu.DITest.Deptproperty namedname value财务部//bean/property/bean③ 使用级联赋值
!-- 3.级联赋值--bean idemp classcom.hbnu.DITest.Empproperty nameename valuemary/property nameage value25/property namedept refdept/property namedept.dname value测试部//beanbean iddept classcom.hbnu.DITest.Dept!--这一行可要可不要仅作参考上面已经给部门名称赋值为了测试部--property namedname value技术部//bean测试
Testpublic void testemp(){ApplicationContext applicationContextnew ClassPathXmlApplicationContext(bean-ditest.xml);Emp empapplicationContext.getBean(emp,Emp.class);emp.work();}5.复杂类型注入 ①数组类型注入
在 Emp 类里面加一个数组属性private String[] hobbies;后生成get、set方法编写xml文件
!-- 数组类型赋值--bean iddept classcom.hbnu.DITest.Dept/bean idemp classcom.hbnu.DITest.Empproperty nameename valuetom/property nameage value34/property namedept refdept/property namehobbiesarrayvalue抽烟/valuevalue喝酒/valuevalue烫头/value/array/property/bean②集合类型注入
在Dept类里加一个员工listprivate ListEmp empList;一个部门里可以有多个员工
!-- 为list集合赋值--bean idemp1 classcom.hbnu.DITest.Empproperty nameename valuetom1/property nameage value31//beanbean idemp2 classcom.hbnu.DITest.Empproperty nameename valuetom2/property nameage value32//beanbean iddept classcom.hbnu.DITest.Deptproperty namedname value技术部/property nameempListlistref beanemp1/refref beanemp2/ref/list/property/bean输出技术部里的员工
Dept{dname技术部, empList[Emp{deptnull, enametom1, age31, hobbiesnull}, Emp{deptnull, enametom2, age32, hobbiesnull}]}③map类型注入
创建Student和Teacher类 对于学生来说一个学生对应多个讲师
!-- map类型注入--bean idteacherone classcom.hbnu.DITest.Teacherproperty nametid value121/property nametname value莉莉//beanbean idteachertwo classcom.hbnu.DITest.Teacherproperty nametid value122/property nametname value小月//beanbean idstudent classcom.hbnu.DITest.Studentproperty namesid value111/property namesname value张三/property nameteacherMapmapentrykeyvalue10010/value/keyref beanteacherone/ref/entryentrykeyvalue10011/value/keyref beanteachertwo/ref/entry/map/property/bean输出{10010Teacher{Tname莉莉, Tid121}, 10011Teacher{Tname小月, Tid122}}
④引用集合类型的bean
创建一个Lesson类getter、setter、重写toString,再在Student类里面加一个 public ListLesson lessonList;一个学生有多个老师选多门课
bean idlesson1 classcom.hbnu.DITest.Lessonproperty namelessonname value前端开发//beanbean idlesson2 classcom.hbnu.DITest.Lessonproperty namelessonname valuejava开发//beanbean idteacher1 classcom.hbnu.DITest.Teacherproperty nametname value张老师/property nametid value001//beanbean idteacher2 classcom.hbnu.DITest.Teacherproperty nametname value王老师/property nametid value002//beanbean idstudent classcom.hbnu.DITest.Studentproperty namesid value1000/property namesname valuelucy/!-- 注入list、map类型属性--property namelessonList reflessonlist/property nameteacherMap refteachermap//beanutil:list idlessonlistref beanlesson1/ref beanlesson2//util:listutil:map idteachermapentrykeyvalue10010/value/keyref beanteacher1//entryentrykeyvalue10011/value/keyref beanteacher2//entry/util:map
/beansxml文件的头部
?xml version1.0 encodingUTF-8?
beans xmlnshttp://www.springframework.org/schema/beansxmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexmlns:utilhttp://www.springframework.org/schema/utilxsi:schemaLocationhttp://www.springframework.org/schema/utilhttp://www.springframework.org/schema/util/spring-util.xsdhttp://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd输出
{10010Teacher{Tname张老师, Tid001}, 10011Teacher{Tname王老师, Tid002}}
[Lesson{lessonname前端开发}, Lesson{lessonnamejava开发}]脱离数据库思想注入复杂类型创建一个dataType类里面拥有private String[] arr;private ListString lists;private MapString,String maps;private Properties properties;属性编写xml文件
!-- 注入复杂类型--bean iddataType classcom.hbnu.pojo.DataType
!-- 1.注入数组类型--property namearrlistvalue斯蒂芬金/valuevalue毛姆/valuevalue陀思妥耶夫斯基/valuevalue茨威格/value/list/property!-- 2.注入list集合类型--property namelistslistvalue马克吐温/valuevalue马克吐温/valuevalue马克吐温/valuevalue马克吐温/value/list/property!-- 3.注入map集合类型--property namemapsmapentry keyusername value雨果/entry keyage value1984//map/property!-- 4.注入properties--property namepropertiespropsprop keydriverClasscom.mysql.cj.jdbc.Driver/propprop keyurljdbc:mysql://localhost:3306/class2110?serverTimezoneGMTamp;useSSLfalse/propprop keyusernameroot/propprop keypassword123456/prop/props/property/bean6.p命名空间 !-- p命名空间注入--bean idstudentp classcom.hbnu.DITest.Studentp:sid100 p:snamemary p:lessonList-reflessonlist p:teacherMap-refteachermap头部加一行
xmlns:phttp://www.springframework.org/schema/p7.bean的作用域 概念 在Spring中可以通过配置bean标签的scope属性来指定bean的作用域范围
取值含义创建对象的时机singleton在IOC容器中这个bean的对象始终为单实例IOC容器初始化时prototype这个bean在IOC容器中有多个实例获取bean时 Testpublic void testOrders(){ApplicationContext applicationContextnew ClassPathXmlApplicationContext(bean-ditest.xml);Orders ordersapplicationContext.getBean(orders,Orders.class);Orders orders2applicationContext.getBean(orders,Orders.class);System.out.println(orders);System.out.println(orders2);}8.bean的生命周期 1.bean对象创建调用无参数构造 2.给bean对象设置相关属性 3.bean后置处理器初始化之前 4.bean对象初始化调用指定初始化方法 5.bean后置处理器初始化之后 6.bean对象创建完成 7.bean对象销毁配置指定销毁的方法 8.IoC容器关闭
3.4 基于注解管理bean 步骤1.引入依赖 2.开启组件扫描 3.使用注解定义bean 4.依赖注入 1.开启组件扫描 开启组件扫描(开启此功能后spring就会自动从扫描指定的包及其子包下的所有类。如果类上使用了Component注解就将该类装配到容器中) context:component-scan base-packagecom.hbnu/context:component-scan2.使用注解定义bean 注解说明Component该注解用于描述Spring中的bean仅仅表示容器中的一个组件并且可以作用在应用的任何层次例如Service层Dao层。Repository该注解用于将数据访问层Dao层的类标识为S加粗样式pring中的bean其功能与Component相同Service该注解通常作用在业务层Service层用于将业务层的类标识为Spring中的bean其功能与Component相同Controller该注解通常作用在控制层如SpringMVC中的Controller用于将控制层的类标识为Spring中的bean其功能与Component相同 3.Autowired注入 注入可以理解为导包注入后就可以调用方法 在controller里注入service在service里注入dao
写个测试感受一下Autowired注入…项目结构如下 首先在bean.xml里编写代码进行包扫描然后创建UserDao以及其实现类
接着创建UserService以及其实现类并将UserDao注入到UserService中。 最后创建UserController将UserService注入后进行测试。
public class Test {public static void main(String[] args) {ApplicationContext applicationContextnew ClassPathXmlApplicationContext(bean.xml);UserController userControllerapplicationContext.getBean(UserController.class);userController.add();}
}