# spring-study **Repository Path**: xiyounote/spring-study ## Basic Information - **Project Name**: spring-study - **Description**: No description available - **Primary Language**: Java - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2021-07-06 - **Last Updated**: 2021-07-15 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ## xml配置 ```xml ``` ## 常用依赖 ```xml org.springframework spring-webmvc 5.3.8 junit junit 4.13.2 ``` ## 注解说明 @Autowired: 自动装配通过类型、名字 ```xml ``` @Resource : 自动装配通过名字、类型 @Value :给属性添加注解 ## 8、使用注解开发 在Spring4之后,要使用注解开发必须导入aop包 导入context约束,增加注解支持 - 1 bean - 2 属性如何注入 ```java @Component public class User { // 等价于 @Value("周杰伦") public String name; public String getName() { return name; } public void setName(String name) { this.name = name; } } ``` - 3 衍生的注解 @Component :组件放在类上,说明这个类被Spring管理了。 - 衍生注解 - dao[@Repository] - service[@Service] - controller [@Controller] - 4 自动装配 - 5 作用域 @Scope("singleton") 单例 - 6 小结 xml与注解 xml: 维护简单 注意: ```xml ``` ## 9 、使用java配置注解 spring-07-appconfig @Configuration: 和beans等价 @Bean: 和bean等价 分类 通过AnnotationConfigApplicationContext ## 10、代理模式 - 静态代理 - 动态代理 ### 10.1 静态代理 角色分析: - 抽象角色: 使用接口或抽象类 - 真实角色:被代理的对象 - 代理角色: 代理真实角色, 中介,会有附属操作 - 客户: 访问代理对象的人 spring-08-proxy eg1: 房东租房demo1 租房接口 Rent 房东 Host 实现Rent 客户 Client, Host, Proxy, proxy.rent() 代理 Proxy : Host ,Proxy() ,Proxy(Host) , rent() , seaHouse(),fee(),hetong(), 好处: - 可以使真实操作更加纯粹 - 实现业务分工 - 公共业务拓展时方便集中管理 缺点: - 一个真实角色都得一个代理角色 eg2: demo2给service服务每个方法添加一个log日志功能。 ### 10.2 动态代理 动态生成,和静态代理角色一样 两大类:基于接口的动态代理(JDK动态代理);基于类的动态代理(java字节码javassist,cglib) 两个类: Proxy, InvocationHandler **InvocationHandler** reflect反射包, https://www.zhihu.com/question/20794107 ```java //demo3 //ProxyInvocationHandler implements InvationHandler{} ``` 每一个动态代理类的调用处理程序都必须实现InvocationHandler接口 java反射机制getDeclaredMethod()获取方法,然后invode执行示例对应的方法 getClass(),获取内存中的类 getClassLoader(), classLoader:负责把磁盘上的.class文件加载到JVM内存中。 ```java public class MyTest { public static void main(String[] args) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException { Method rentMethod = Host.class.getDeclaredMethod("rent"); Host host = new Host(); rentMethod.invoke(host); System.out.println(host.getClass()); System.out.println(host.getClass().getName()); ClassLoader classLoader =host.getClass().getClassLoader(); System.out.println(classLoader);//应用类加载器 ClassLoader classLoader1 = classLoader.getParent(); System.out.println(classLoader1);//扩展类加载器 ClassLoader classLoader2 = classLoader1.getParent(); System.out.println(classLoader2);//跟类加载器 /** * (1)根类加载器(null) 它是由本地代码(c/c++)实现的,你根本拿不到他的引用,但是他实际存在,并且加载一些重要的类,它加载(%JAVA_HOME%\jre\lib),如rt.jar(runtime)、i18n.jar等,这些是Java的核心类。 (2)平台类加载器(PlatformClassLoader)(jdk1.8之后的版本,之前的称为扩展类加载器 ExtClassLoader) 虽说能拿到,但是我们在实践中很少用到它,它主要加载扩展目录下的jar包, %JAVA_HOME%\lib\ext (3)应用类加载器(appClassLoader) 它主要加载我们应用程序中的类,如Test,或者用到的第三方包,如jdbc驱动包等。这里的父类加载器与类中继承概念要区分,它们在class定义上是没有父子关系的。 */ } } ``` Java 中著名的委托加载机制 getInterfaces(),与反射机制有关,获取这个对象所有实现的接口 ## 11、AOP - 横切关注点: 跨域多个模块的方法或功能, 与业务无关,横切关注点:日志、安全、缓存... - 切面(ASPECT): 模块化的特殊对象,是一个类。在Spring AOP中,方面是通过使用常规类(基于模式的方法)或使用@Aspect注释(@AspectJ风格)注释的常规类来实现的。 - 通知(Advice): 切面要完成的工作,是一个方法。 - 目标(Target): 被通知的对象; - 代理(Proxy): 向目标对象应用通知后创建的对象; - 切入点(PointCut): 切面通知执行的“地点”的定义 - 连接点(JointPoint): 与切入点匹配的执行点 通知(Advice)的类型: 前置通知(Before advice):在某个连接点(Join point)之前执行的通知,但这个通知不能阻止连接点的执行(除非它抛出一个异常)。 返回后通知(After returning advice):在某个连接点(Join point)正常完成后执行的通知。例如,一个方法没有抛出任何异常正常返回。 抛出异常后通知(After throwing advice):在方法抛出异常后执行的通知。 后置通知(After(finally)advice):当某个连接点(Join point)退出的时候执行的通知(不论是正常返回还是发生异常退出)。 环绕通知(Around advice):包围一个连接点(Join point)的通知,如方法调用。这是最强大的一种通知类型。环绕通知可以在方法前后完成自定义的行为。它也会选择是否继续执行连接点或直接返回它们自己的返回值或抛出异常来结束执行。 导入的包 ```xml org.aspectj aspectjweaver 1.9.7 ``` //log/.. 日志增强类 MethodBeforeAdvice AfterReturningAdvice //注册bean, //配置Aop 导入aop约束 注解实现 AnnotationPointCut ```xml terLog" pointcut-ref="pointcut"/> ``` ## 12 整合mybatis - 步骤: 1,导入包;2,编写配置文件;3,测试 junit, mybatis, mysql, spring相关, aop织入,mybatis-spring ```xml junit junit 4.13.2 mysql mysql-connector-java 8.0.11 org.mybatis mybatis 3.5.0 org.springframework spring-webmvc 5.3.8 org.springframework spring-jdbc 4.3.7.RELEASE org.aspectj aspectjweaver 1.8.9 org.mybatis mybatis-spring 2.0.0 ``` 连接数据库,编写实体类,编写核心配置文件 ```xml ``` Mybatis报错use a more specifc time zone value if you want to utilize time zone support 解决方法:jdbc:mysql://localhost:3306?serverTimezone=UTC" http://mybatis.org/spring/zh/index.html MyBatis-Spring