基础框架

pom.xml

  1. <dependencies>
  2. <dependency>
  3. <groupId>org.springframework</groupId>
  4. <artifactId>spring-webmvc</artifactId>
  5. <version>5.3.4</version>
  6. </dependency>
  7. <dependency>
  8. <groupId>javax.servlet</groupId>
  9. <artifactId>servlet-api</artifactId>
  10. <version>3.0-alpha-1</version>
  11. <!-- 打包的时候可以不用包进去,别的设施会提供。-->
  12. <scope>provided</scope>
  13. </dependency>
  14. <dependency>
  15. <groupId>javax.servlet.jsp</groupId>
  16. <artifactId>jsp-api</artifactId>
  17. <version>2.0</version>
  18. <scope>provided</scope>
  19. </dependency>
  20. </dependencies>

web.xml

<!--    前端控制器-->
    <servlet>
        <servlet-name>dispatcherServlet</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>        
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:springxml.xml</param-value>
        </init-param>
    </servlet>   
    <servlet-mapping>
        <servlet-name>dispatcherServlet</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>

springmvc.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:mvc="http://www.springframework.org/schema/mvc" xsi:schemaLocation="
        http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/mvc
        http://www.springframework.org/schema/mvc/spring-mvc.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd
        http://www.springframework.org/schema/aop
        http://www.springframework.org/schema/aop/spring-aop.xsd"> <!-- bean definitions here -->
<!--    扫描注解-->
        <context:component-scan base-package="com.lpl"/>
<!--    映射器和适配器-->
        <mvc:annotation-driven/>
<!--    视图解析器-->
        <bean name="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <!--前缀-->
            <property name="prefix" value="WEB-INF/jsp"/>
        <!--后缀,可以不写-->
            <property name="suffix" value=".jsp"/>
            </bean>
</beans>

application.properties

spring.mvc.servlet.path=/quanjulujing

controller.java

@Controller
@RequestMapping("user")//一级访问路径
public class UserController {
    //登录
    @RequestMapping("login")//二级访问路径
    public ModelAndView login(){
        System.out.println("连接数据库查询...");
        ModelAndView modelAndView = new ModelAndView();
        modelAndView.addObject("username","张三");
        modelAndView.setViewName("/index.jsp");
        return modelAndView;
    }
}

<scope>?<scope>
 1.compile:默认值 他表示被依赖项目需要参与当前项目的编译,还有后续的测试,运行周期也参与其中,是一个比较强的依赖。打包的时候通常需要包含进去。<br />     2.test:依赖项目仅仅参与测试相关的工作,包括测试代码的编译和执行,不会被打包,例如:junit。<br />     3.runtime:表示被依赖项目无需参与项目的编译,不过后期的测试和运行周期需要其参与。与compile相比,跳过了编译而已。例如JDBC驱动,适用运行和测试阶段。<br />     4.provided:打包的时候可以不用包进去,别的设施会提供。事实上该依赖理论上可以参与编译,测试,运行等周期。相当于compile,但是打包阶段做了exclude操作。<br />    5.system:从参与度来说,和provided相同,不过被依赖项不会从maven仓库下载,而是从本地文件系统拿。需要添加systemPath的属性来定义路径。

技术

DI(依赖注入)

set,构造器,注解

循环依赖

https://blog.csdn.net/u010853261/article/details/77940767
对象的相互依赖关系。循环调用其实就是一个死循环

检测循环依赖相对比较容易,Bean在创建的时候可以给该Bean打标,如果递归调用回来发现正在创建中的话,即说明了循环依赖了。 singletonFactories : 单例对象工厂的cache earlySingletonObjects :提前暴光的单例对象的Cache singletonObjects:单例对象的cache

ioc(控制反转)

原本是直接new对象注入(或者简单工厂),现在交给Spring来进行配置实现

1、增加一个spring配置文件 2、解析xml的配置文件 3、BeanFactory工厂类 4、在工厂类中使用反射创建bean对象

bean基于配置实例化方式有三种形式

● 通过无参构造实例化
● 通过静态功能方式实例化
● 通过普通工厂实例化

AOP(动态代理)

https://blog.csdn.net/u013782203/article/details/51799427
通知,增强处理(Advice)
连接点(JoinPoint):和方法有关的前前后后,可以切入的地方
切入点(Pointcut):想要切入的地方
切面(Aspect):通知和切入点的结合
引入(introduction):加入的方法和属性
目标(target)
代理(proxy)
织入(weaving)
目标对象
AOP代理
AOP代理方法

@Aspect //使其成为切面类 @Component //切面类加入IOC容器 @Before @After @Around @AfterReturning @AfterThrowing

根据类加载器和接口创建代理类

静态代理

由程序员创建或工具生成代理类的源码,再编译代理类。所谓静态也就是在程序运行前就已经存在代理类的字节码文件,代理类和委托类的关系在运行前就确定了。

运行流程

图片.png

mybatis

#在编译时注入,$直接传递参数

spring

bean的生命周期

1、 实例化(Instantiation) 2、 属性设置(populate) 3、 初始化(Initialization) 4、 销毁(Destruction)

对Bean的创建最为核心的三个方法

  • createBeanInstance:例化,其实也就是调用对象的构造方法实例化对象
  • populateBean:填充属性,这一步主要是对bean的依赖属性进行注入(@Autowired)
  • initializeBean:回到一些形如initMethodInitializingBean等方法, 调用spring xml中的init 方法。

从对单例Bean的初始化可以看出,循环依赖主要发生在第二步(populateBean),也就是field属性注入的处理。

如何快速的得到多个参数的对象?

在方法中声明该对象,springMVC会自动赋值

SpringMVC返回值?

建议String, ModelAndView类把视图和数据合并

SpringMVC后台传前台数据使用ModelAndView
如何把ModelMap数据放入Session?

在类上加入@SessionAttributes,里面包含的字符串就是放入session的key

图片.png

mybatis初始化

https://blog.csdn.net/bug_remover/article/details/86685439

工作原理

https://blog.csdn.net/u014297148/article/details/78696096?utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromMachineLearnPai2%7Edefault-1.control&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromMachineLearnPai2%7Edefault-1.control

工作原理分为六个部分: 读取核心配置文件并返回InputStream流对象。 根据InputStream流对象解析出Configuration对象,然后创建SqlSessionFactory工厂对象 根据一系列属性从SqlSessionFactory工厂中创建SqlSession 从SqlSession中调用Executor执行数据库操作&&生成具体SQL指令(Executor是Mybatis的一个核心接口,每一个SqlSession对象都会拥有一个Executor(执行器对象);这个执行对象负责[增删改查]的具体操作,我们可以简单的将它理解为JDBC中Statement的封装版) 对执行结果进行二次封装 提交与事务

SpringMVC

Filter过滤器

依赖于servlet容器
实现上基于函数回调,对全部请求过滤
缺点是过滤器实例只在容器初始化调用一次

Interceptor拦截器

依赖于web框架,SpringMVC中依赖SPringMVC框架
基于java反射机制,属于AOP
只对controller请求进行拦截,忽视对静态资源的访问

对比

原理不同
Interceptor更灵活强大(可以在请求前后拦截)
Filter主要对URL进行过滤(如登录)

其他

无法对应的字段要加上@Transient注解

apache-tomcat-6.0.26\conf\Catalina\localhost\travel.xml

webapp路径

将路径指向你部署的文件夹,可以指定在其他路径,而非webapp下。

注意:${catalina.home}是相对路径哦,如果有中文,而该文件为gb2312格式,那么可能会报错,将这个文件的编码改为UTF-8即可。

applicationContext.xml和dispatcher-servlet.xml两个配置文件

两文件形成了两个父子关系的上下文。
在applicationContext和dispatcher-servlet定义的bean最好不要重复, dispatcher-servlet最好只是定义controller类型的bean。

@Autowired 和 @Resource

https://blog.csdn.net/weixin_43887814/article/details/108851466

1、@Autowired 是通过 byType 的方式去注入的, 使用该注解,要求接口只能有一个实现类。 2、@Resource 可以通过 byName 和 byType的方式注入, 默认先按 byName的方式进行匹配,如果匹配不到,再按 byType的方式进行匹配。 3、@Qualifier 注解配合@Autowired 一起使用。

@RestController

https://www.cnblogs.com/wu-sheng/p/15551198.html

等同于@Controller + @ResponseBody

@ResponseBody

https://blog.csdn.net/originations/article/details/89492884
@ResponseBody的作用其实是将java对象转为json格式的数据。 将controller的方法返回的对象通过适当的转换器转换为指定的格式之后,写入到response对象的body区,通常用来返回JSON数据或者是XML数据。

@RequestMapping

注解是用来映射请求的 ,就是访问url相对路径