基础框架
pom.xml
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.3.4</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>3.0-alpha-1</version>
<!-- 打包的时候可以不用包进去,别的设施会提供。-->
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.0</version>
<scope>provided</scope>
</dependency>
</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(依赖注入)
循环依赖
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
静态代理
由程序员创建或工具生成代理类的源码,再编译代理类。所谓静态也就是在程序运行前就已经存在代理类的字节码文件,代理类和委托类的关系在运行前就确定了。
运行流程
mybatis
#在编译时注入,$直接传递参数
spring
bean的生命周期
1、 实例化(Instantiation) 2、 属性设置(populate) 3、 初始化(Initialization) 4、 销毁(Destruction)
对Bean的创建最为核心的三个方法
createBeanInstance
:例化,其实也就是调用对象的构造方法实例化对象populateBean
:填充属性,这一步主要是对bean的依赖属性进行注入(@Autowired
)initializeBean
:回到一些形如initMethod
、InitializingBean
等方法, 调用spring xml中的init 方法。
从对单例Bean的初始化可以看出,循环依赖主要发生在第二步(populateBean),也就是field属性注入的处理。
如何快速的得到多个参数的对象?
在方法中声明该对象,springMVC会自动赋值
SpringMVC返回值?
建议String, ModelAndView类把视图和数据合并
SpringMVC后台传前台数据使用ModelAndView
如何把ModelMap数据放入Session?
在类上加入@SessionAttributes,里面包含的字符串就是放入session的key
mybatis初始化
https://blog.csdn.net/bug_remover/article/details/86685439
工作原理
工作原理分为六个部分: 读取核心配置文件并返回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相对路径