Spring(spring cloud)

  本篇文章为你整理了Spring(spring cloud)的详细内容,包含有springboot spring cloud spring框架 springmvc Spring,希望能帮助你了解 Spring。

  

 ?xml version="1.0" encoding="UTF-8"? 

 

   beans xmlns="http://www.springframework.org/schema/beans"

   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

   xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"

   !-- 将对象装配到IOC容器中--

   bean id="stuZhenzhong"

   property name="stuId" value="101" /property

   property name="stuName" value="zhenzhong" /property

   /bean

   /beans

  

 

  
ApplicationContext iocObj =

   new ClassPathXmlApplicationContext("applicationContext.xml");

   //通过容器对象,获取需要对象

   Student stuZhenzhong = (Student)iocObj.getBean("stuZhenzhong");

   System.out.println("stuZhenzhong = " + stuZhenzhong);

  

 

 

  
非侵入式:基于Spring开发的应用中的对象可以不依赖于Spring的API。

  容器:Spring是一个容器,因为它包含并且管理应用对象的生命周期。

  组件化:Spring实现了使用简单的组件配置组合成一个复杂的应用。在 Spring 中可以使用XML和Java注解组合这些对象。

  一站式:在IOC和AOP的基础上可以整合各种企业应用的开源框架和优秀的第三方类库(实际上Spring 自身也提供了表述层的SpringMVC和持久层的JDBCTemplate)。

  1.4 Spring中getBean()三种方式

  
不足:容器中有多个相同类型bean的时候,会报如下错误:

  expected single matching bean but found 2: stuZhenzhong,stuZhouxu

  
注意:框架默认都是通过无参构造器,帮助我们创建对象。

  ​ 所以:如提供对象的构造器时,一定添加无参构造器

  1.5 bean标签详解

  id:bean的唯一标识

  class:定义bean的类型【class全类名】

  
BeanFactory:IOC容器的基本实现,是Spring内部的使用接口,是面向Spring本身的,不是提供给开发人员使用的。****

  ApplicationContext:BeanFactory的子接口,提供了更多高级特性。面向Spring的使用者,几乎所有场合都使用ApplicationContext而不是底层的BeanFactory。

  2.2 图解IOC类的结构

  BeanFactory:Spring底层IOC实现【面向Spring框架】

  ApplicationContext:面向程序员

  ConfigurableApplicationContext:提供关闭或刷新容器对象方法

  ClassPathXmlApplicationContext:基于类路径检索xml文件

  AnnotationConfigApplicationContext:基于注解创建容器对象

  FileSystemXmlApplicationContext:基于文件系统检索xml文件

  
property name="deptId" value="1" /property

   property name="deptName" value="研发部门" /property

   /bean

   bean id="empChai"

   property name="id" value="101" /property

   property name="lastName" value="chai" /property

   property name="email" value="chai@163.com" /property

   property name="salary" value="50.5" /property

   property name="dept" ref="dept1" /property

   property name="dept.deptName" value="财务部门" /property

   /bean

  

 

 

  
内部类:在一个类中完整定义另一个类,当前类称之为内部类

  内部bean:在一个bean中完整定义另一个bean,当前bean称之为内部bean

  
property name="id" value="102" /property

   property name="lastName" value="xx" /property

   property name="email" value="xx@163.com" /property

   property name="salary" value="51.5" /property

   property name="dept"

   bean

   property name="deptId" value="2" /property

   property name="deptName" value="人事部门" /property

   /bean

   /property

   /bean

  

 

 

  
property name="deptId" value="3" /property

   property name="deptName" value="程序员鼓励师" /property

   property name="empList"

   list

   ref bean="empChai" /ref

   ref bean="empXin" /ref

   !-- bean /bean --

   /list

   /property

   /bean

   !-- 测试提取List--

   util:list id="empList"

   ref bean="empChai" /ref

   ref bean="empXin" /ref

   /util:list

   bean id="dept4"

   property name="deptId" value="4" /property

   property name="deptName" value="运营部门" /property

   property name="empList" ref="empList" /property

   /bean

  

 

 

  
property name="deptId" value="5" /property

   property name="deptName" value="采购部门" /property

   property name="empMap"

   map

   entry key="101" value-ref="empChai" /entry

   entry

   key value 103 /value /key

   ref bean="empChai" /ref

   /entry

   entry

   key value 102 /value /key

   ref bean="empXin" /ref

   /entry

   /map

   /property

   /bean

   util:map id="empMap"

   entry key="101" value-ref="empChai" /entry

   entry

   key value 103 /value /key

   ref bean="empChai" /ref

   /entry

   entry

   key value 102 /value /key

   ref bean="empXin" /ref

   /entry

   /util:map

   bean id="dept6"

   property name="deptId" value="106" /property

   property name="deptName" value="后勤部门" /property

   property name="empMap" ref="empMap" /property

   /bean

  

 

 

  
constructor-arg name="stuId" value="103" /constructor-arg

   constructor-arg name="stuName" value="zhifeng" /constructor-arg

   /bean

   bean id="stuXiaoxi"

   p:stuId="104"

   p:stuName="xiaoxi" /bean

  

 

 

  


 !-- 加载外部属性文件db.properties-- 

 

   context:property-placeholder location="classpath:db.properties" /context:property-placeholder

   !-- 装配数据源--

   bean id="dataSource"

   property name="driverClassName" value="${db.driverClassName}" /property

   property name="url" value="${db.url}" /property

   property name="username" value="${db.username}" /property

   property name="password" value="${db.password}" /property

   /bean

  

 

  
ApplicationContext ioc =

   new ClassPathXmlApplicationContext("applicationContext_druid.xml");

   DruidDataSource dataSource = ioc.getBean("dataSource", DruidDataSource.class);

   System.out.println("dataSource = " + dataSource);

   DruidPooledConnection connection = dataSource.getConnection();

   System.out.println("connection = " + connection);

  

 

 

  
① 通过构造器或工厂方法创建bean实例

  ② 为bean的属性设置值和对其他bean的引用

  ③ 调用bean的初始化方法

  ④ bean可以使用了

  ⑤ 当容器关闭时,调用bean的销毁方法

  8.2 bean的后置处理器

  
postProcessBeforeInitialization(Object, String):在bean的初始化之前执行

  postProcessAfterInitialization(Object, String):在bean的初始化之后执行

  
① 通过构造器或工厂方法创建bean实例

  ② 为bean的属性设置值和对其他bean的引用

  postProcessBeforeInitialization(Object, String):在bean的初始化之前执行

  ③ 调用bean的初始化方法

  postProcessAfterInitialization(Object, String):在bean的初始化之后执行

  ④ bean可以使用了

  ⑤ 当容器关闭时,调用bean的销毁方法

  第九章 Spring中自动装配【基于XML】

  9.1 Spring中提供两种装配方式

  9.2 Spring自动装配语法及规则

  
byName:对象中属性名称与容器中的beanId进行匹配,如果属性名与beanId数值一致,则自动装配成功

  
匹配多个,会报错

  expected single matching bean but found 2: deptDao,deptDao2

  
基于xml自动装配,底层使用set注入

  最终:不建议使用byName、byType,建议使用注解方式自动装配

  第十章 Spring中注解【非常重要】

  10.1 使用注解将对象装配到IOC容器中

  约定:约束 配置【注解 XML】 代码

  位置:在类上面标识

  注意:

  Spring本身不区分四个注解【四个注解本质是一样的@Component】,提供四个注解的目的只有一个:提高代码的可读性

  只用注解装配对象,默认将类名首字母小写作为beanId

  可以使用value属性,设置beanId;当注解中只使用一个value属性时,value关键字可省略

  
默认【@Autowired(required=true)】报错

  

/*expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}

 

  

 

  
筛选失败【对象中属性名称!=beanId】,报如下错误:

  

//expected single matching bean but found 2: deptDao,deptDao2

 

  

 

  
true:表示被标识的属性必须装配数值,如未装配,会报错。

  false:表示被标识的属性不必须装配数值,如未装配,不会报错。

  
作用:配合@Autowired一起使用,将设置beanId名称装配到属性中

  注意:不能单独使用,需要与@Autowired一起使用

  


 context:component-scan base-package="com.atguigu" use-default-filters="false" 

 

   context:include-filter type="annotation" expression="org.springframework.stereotype.Repository"/

   context:include-filter type="assignable" expression="com.atguigu.service.impl.DeptServiceImpl"/

   /context:component-scan

  

 

  11.3 排除扫描

  

 !-- 【排除扫描】 假设:环境中共有100包,不想扫描2/100-- 

 

   context:component-scan base-package="com.atguigu"

   context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/

   !-- context:exclude-filter type="assignable" expression="com.atguigu.controller.DeptController"/ --

   /context:component-scan

  

 

  第十三章 Spring完全注解开发【0配置】

  13.1 完全注解开发步骤

  创建配置类

  在class上面添加注解

  @Configuration:标识当前类是一个配置类,作用:代替XML配置文件

  @ComponentScan:设置组件扫描当前包及其子包

  
// ApplicationContext context =

  // new ClassPathXmlApplicationContext("applicationContext.xml");

   //使用AnnotationConfigApplicationContext容器对象

   ApplicationContext context =

   new AnnotationConfigApplicationContext(SpringConfig.class);

   DeptDaoImpl deptDao = context.getBean("deptDao", DeptDaoImpl.class);

   System.out.println("deptDao = " + deptDao);

  

 

 

  第十四章 Spring集成Junit4

  14.1 集成步骤

  导入jar包

  spring-test-5.3.1.jar

  
@ContextConfiguration(locations = "classpath:applicationContext.xml")

  @RunWith(SpringJUnit4ClassRunner.class)

  public class TestSpringJunit4 {

   @Autowired

   private DeptService deptService;

   @Test

   public void testService(){

   //创建容器对象

  // ApplicationContext context =

  // new ClassPathXmlApplicationContext("applicationContext.xml");

  // DeptService deptService = context.getBean("deptService", DeptServiceImpl.class);

   deptService.saveDept(new Dept());

  

 

 

  第十五章 AOP前奏

  15.1 代理模式

  
代理模式:我们需要做一件事情,又不期望自己亲力亲为,此时,可以找一个代理【中介】

  
日志代码比较分散,可以提取日志类

  日志代码比较混乱,日志代码【非核心业务代码】与加减乘除方法【核心业务代码】书写一处

  
总结:在核心业务代码中,需要添加日志功能,但不期望在核心业务代码中书写日志代码。

  此时:使用代理模式解决问题【先将日志代码横向提取到日志类中,再动态织入回到业务代码中】

  
类加载器【ClassLoader loader】,目标对象类加载器

   目标对象实现接口:Class ? [] interfaces,目标对象实现所有接口

   InvocationHandler h

   ClassLoader classLoader = target.getClass().getClassLoader();

   Class ? [] interfaces = target.getClass().getInterfaces();

   //创建代理对象

   proxyObj = Proxy.newProxyInstance(classLoader, interfaces, new InvocationHandler() {

   //执行invoke()实现动态织入效果

   @Override

   public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {

   //获取方法名【目标对象】

   String methodName = method.getName();

   //执行目标方法之前,添加日志

   MyLogging.beforeMethod(methodName,args);

   //触发目标对象目标方法

   Object rs = method.invoke(target, args);

   //执行目标方法之后,添加日志

   MyLogging.afterMethod(methodName,rs);

   return rs;

   return proxyObj;

  // class invocationImpl implements InvocationHandler{

  

 

 

  

@Test

 

   public void testBeforeAop(){

  // int add = calc.add(1, 2);

  // System.out.println("add = " + add);

   //目标对象

   Calc calc = new CalcImpl();

   //代理工具类

   MyProxy myProxy = new MyProxy(calc);

   //获取代理对象

   Calc calcProxy = (Calc)myProxy.getProxyObject();

   //测试

  // int add = calcProxy.add(1, 2);

   int div = calcProxy.div(2, 1);

  

 

  以上就是Spring(spring cloud)的详细内容,想要了解更多 Spring的内容,请持续关注盛行IT软件开发工作室。

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: