<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	
	xmlns:georss="http://www.georss.org/georss"
	xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#"
	>

<channel>
	<title>Spring &#8211; Blog of Code</title>
	<atom:link href="https://www.cztcode.com/category/java/spring/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.cztcode.com</link>
	<description></description>
	<lastBuildDate>Sun, 12 Jul 2020 13:02:44 +0000</lastBuildDate>
	<language>zh-Hans</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	

<image>
	<url>https://www.cztcode.com/wp-content/uploads/2024/02/cropped-logo-32x32.webp</url>
	<title>Spring &#8211; Blog of Code</title>
	<link>https://www.cztcode.com</link>
	<width>32</width>
	<height>32</height>
</image> 
<site xmlns="com-wordpress:feed-additions:1">217219486</site>	<item>
		<title>Spring AOP 通知类型实现</title>
		<link>https://www.cztcode.com/2020/3082/</link>
					<comments>https://www.cztcode.com/2020/3082/#respond</comments>
		
		<dc:creator><![CDATA[Jellow]]></dc:creator>
		<pubDate>Sun, 12 Jul 2020 13:02:44 +0000</pubDate>
				<category><![CDATA[Spring]]></category>
		<guid isPermaLink="false">https://www.cztcode.com/?p=3082</guid>

					<description><![CDATA[spring aop通知(advice)分成五类： 前置通知[Before advice]：在连接点前面执行，前置通知不会影响连接点的执行，除非此处抛出异常。 后置通知[After returning advice]：在连接点正常执行完成后执行，如果连接点抛出异常，则不会执行。 异常通知[After throwing advice]：在连接点抛出异常后执行。 返回通知[After (finally [&#8230;]]]></description>
										<content:encoded><![CDATA[<div id="bsf_rt_marker"></div>
<h4 class="wp-block-heading">spring aop通知(advice)分成五类：</h4>



<ol class="wp-block-list"><li>前置通知[Before advice]：在连接点前面执行，前置通知不会影响连接点的执行，除非此处抛出异常。</li><li>后置通知[After returning advice]：在连接点正常执行完成后执行，如果连接点抛出异常，则不会执行。</li><li>异常通知[After throwing advice]：在连接点抛出异常后执行。</li><li>返回通知[After (finally) advice]：在连接点执行完成后执行，不管是正常执行完成，还是抛出异常，都会执行返回通知中的内容。</li><li>环绕通知[Around advice]：环绕通知围绕在连接点前后，比如一个方法调用的前后。这是最强大的通知类型，能在方法调用前后自定义一些操作。环绕通知还需要负责决定是继续处理join point(调用ProceedingJoinPoint的proceed方法)还是中断执行。</li></ol>



<p class="is-style-iw-2em">接下来通过编写示例程序来测试一下五种通知类型：</p>



<h3 class="wp-block-heading">非注解方式</h3>



<h4 class="wp-block-heading">前置通知</h4>



<p class="is-style-iw-2em">定义aop类</p>



<figure class="wp-block-image size-large"><img decoding="async" src="https://www.cztcode.com/wp-content/uploads/2020/07/image-70.png" alt="" class="wp-image-3083"/></figure>



<ul class="wp-block-list"><li>method：被调用的方法，就是连接点</li><li>objects：被调用方法的参数</li><li>o：调用被调用方法的对象</li></ul>



<p class="is-style-iw-2em">xml文件</p>



<p class="is-style-iw-2em">注意要先在ioc容器中放入对象才能使用id引用。</p>



<figure class="wp-block-image size-large"><img decoding="async" src="https://www.cztcode.com/wp-content/uploads/2020/07/image-71-1024x280.png" alt="" class="wp-image-3084"/></figure>



<pre class="wp-block-code"><code> &lt;bean id="logBefore" class="com.cztcode.spring.aop.LogBefore"/>
    &lt;aop:config>
        &lt;aop:pointcut id="point" expression="execution(public void com.cztcode.spring.impl.StudentServiceImpl.addStudent(com.cztcode.spring.entity.Student))"/>
&lt;!--        关联ref，当执行点时，执行advice-->
        &lt;aop:advisor advice-ref="logBefore" pointcut-ref="point"/> 
    &lt;/aop:config></code></pre>



<p class="is-style-iw-2em">执行结果</p>



<figure class="wp-block-image size-large"><img decoding="async" src="https://www.cztcode.com/wp-content/uploads/2020/07/image-72.png" alt="" class="wp-image-3085"/></figure>



<h4 class="wp-block-heading">后置通知</h4>



<p class="is-style-iw-2em">后置通知与前置类似，只是参数和接口不同</p>



<figure class="wp-block-image size-large"><img decoding="async" src="https://www.cztcode.com/wp-content/uploads/2020/07/image-73.png" alt="" class="wp-image-3086"/></figure>



<p class="is-style-iw-2em">多了一个</p>



<ul class="wp-block-list"><li>returnValue：方法返回值</li></ul>



<p class="is-style-iw-2em">xml文件</p>



<figure class="wp-block-image size-large"><img decoding="async" src="https://www.cztcode.com/wp-content/uploads/2020/07/image-74-1024x126.png" alt="" class="wp-image-3087"/></figure>



<p class="is-style-iw-2em">执行结果</p>



<figure class="wp-block-image size-large"><img decoding="async" src="https://www.cztcode.com/wp-content/uploads/2020/07/image-75.png" alt="" class="wp-image-3088"/></figure>



<h4 class="wp-block-heading">异常通知</h4>



<figure class="wp-block-image size-large"><img decoding="async" src="https://www.cztcode.com/wp-content/uploads/2020/07/image-76.png" alt="" class="wp-image-3089"/></figure>



<p class="is-style-iw-2em">Exception：异常类型</p>



<figure class="wp-block-image size-large"><img decoding="async" src="https://www.cztcode.com/wp-content/uploads/2020/07/image-78-1024x118.png" alt="" class="wp-image-3091"/></figure>



<figure class="wp-block-image size-large"><img decoding="async" src="https://www.cztcode.com/wp-content/uploads/2020/07/image-77.png" alt="" class="wp-image-3090"/></figure>



<h4 class="wp-block-heading">环绕通知</h4>



<p class="is-style-iw-2em">环绕通知很强大，上面那三个通知都可以做到。</p>



<figure class="wp-block-image size-large"><img decoding="async" src="https://www.cztcode.com/wp-content/uploads/2020/07/image-81-1024x286.png" alt="" class="wp-image-3095"/></figure>



<p class="is-style-iw-2em">xml文件配置方法相同。</p>



<figure class="wp-block-image size-large"><img decoding="async" src="https://www.cztcode.com/wp-content/uploads/2020/07/image-82.png" alt="" class="wp-image-3096"/></figure>



<p class="is-style-iw-2em">如果invocation.proceed()没有写，那么这个切入点方法就不会被执行。但是环绕方法的通知会执行。</p>



<p class="is-style-iw-2em">环绕通知底层通过拦截器实现。</p>



<h4 class="wp-block-heading">注解形式</h4>



<h4 class="wp-block-heading">前置和后置通知</h4>



<figure class="wp-block-image size-large"><img decoding="async" src="https://www.cztcode.com/wp-content/uploads/2020/07/image-83-1024x434.png" alt="" class="wp-image-3097"/></figure>



<p class="is-style-iw-2em">开启扫描器和对AOP注解支持</p>



<figure class="wp-block-image size-large"><img decoding="async" src="https://www.cztcode.com/wp-content/uploads/2020/07/image-84.png" alt="" class="wp-image-3098"/></figure>



<p class="is-style-iw-2em">实现效果</p>



<figure class="wp-block-image size-large"><img decoding="async" src="https://www.cztcode.com/wp-content/uploads/2020/07/image-85.png" alt="" class="wp-image-3099"/></figure>



<h4 class="wp-block-heading">异常通知</h4>



<figure class="wp-block-image size-large"><img decoding="async" src="https://www.cztcode.com/wp-content/uploads/2020/07/image-86-1024x92.png" alt="" class="wp-image-3100"/></figure>



<figure class="wp-block-image size-large"><img decoding="async" src="https://www.cztcode.com/wp-content/uploads/2020/07/image-87.png" alt="" class="wp-image-3101"/></figure>



<p class="is-style-iw-2em">截获某种异常</p>



<figure class="wp-block-image size-large"><img decoding="async" src="https://www.cztcode.com/wp-content/uploads/2020/07/image-91-1024x109.png" alt="" class="wp-image-3106"/></figure>



<p class="is-style-iw-2em">若发生异常通知，后置通知将不会触发</p>



<h4 class="wp-block-heading">环绕通知</h4>



<figure class="wp-block-image size-large"><img decoding="async" src="https://www.cztcode.com/wp-content/uploads/2020/07/image-88-1024x251.png" alt="" class="wp-image-3103"/></figure>



<h4 class="wp-block-heading">最终通知</h4>



<p class="is-style-iw-2em">其实在环绕通知中已经实现了最终通知</p>



<figure class="wp-block-image size-large"><img decoding="async" src="https://www.cztcode.com/wp-content/uploads/2020/07/image-89-1024x81.png" alt="" class="wp-image-3104"/></figure>



<figure class="wp-block-image size-large"><img decoding="async" src="https://www.cztcode.com/wp-content/uploads/2020/07/image-90.png" alt="" class="wp-image-3105"/></figure>
]]></content:encoded>
					
					<wfw:commentRss>https://www.cztcode.com/2020/3082/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">3082</post-id>	</item>
		<item>
		<title>Spring AOP</title>
		<link>https://www.cztcode.com/2020/3066/</link>
					<comments>https://www.cztcode.com/2020/3066/#respond</comments>
		
		<dc:creator><![CDATA[Jellow]]></dc:creator>
		<pubDate>Sat, 11 Jul 2020 00:00:00 +0000</pubDate>
				<category><![CDATA[Spring]]></category>
		<guid isPermaLink="false">https://www.cztcode.com/?p=3066</guid>

					<description><![CDATA[在软件业，AOP为Aspect Oriented Programming的缩写，意为：面向切面编程，通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。AOP是OOP的延续，是软件开发中的一个热点，也是Spring框架中的一个重要内容，是函数式编程的一种衍生范型。利用AOP可以对业务逻辑的各个部分进行隔离，从而使得业务逻辑各部分之间的耦合度降低，提高程序的可重用性，同时提高
了开发的效率。]]></description>
										<content:encoded><![CDATA[<div id="bsf_rt_marker"></div>
<p class="is-style-iw-2em">在软件业，AOP为Aspect Oriented Programming的缩写，意为：面向切面编程，通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。AOP是OOP的延续，是软件开发中的一个热点，也是Spring框架中的一个重要内容，是函数式编程的一种衍生范型。利用AOP可以对业务逻辑的各个部分进行隔离，从而使得业务逻辑各部分之间的耦合度降低，提高程序的可重用性，同时提高<br>了开发的效率。</p>



<p class="is-style-iw-2em">详细介绍：<a href="https://zhuanlan.zhihu.com/p/37497663" class="rank-math-link" target="_blank" rel="noopener">细说Spring——AOP详解（AOP概览）</a></p>



<p class="is-style-iw-2em">找了一些资料，混合着我的理解补充。</p>



<h2 class="wp-block-heading">Spring AOP 简介</h2>



<p class="is-style-iw-2em">如果说 IoC 是 Spring 的核心，那么面向切面编程就是 Spring 最为重要的功能之一了，在数据库事务中切面编程被广泛使用。</p>



<h4 class="wp-block-heading">AOP 即 Aspect Oriented Program 面向切面编程</h4>



<p class="is-style-iw-2em">首先，在面向切面编程的思想里面，把功能分为核心业务功能，和周边功能。</p>



<ul class="wp-block-list"><li><strong>所谓的核心业务</strong>，比如登陆，增加数据，删除数据都叫核心业务</li><li><strong>所谓的周边功能</strong>，比如性能统计，日志，事务管理等等</li></ul>



<p class="is-style-iw-2em">周边功能在 Spring 的面向切面编程AOP思想里，即被定义为切面</p>



<p class="is-style-iw-2em">在面向切面编程AOP的思想里面，核心业务功能和切面功能分别独立进行开发，然后把切面功能和核心业务功能 &#8220;编织&#8221; 在一起，这就叫AOP。</p>



<h4 class="wp-block-heading">AOP 的目的</h4>



<p class="is-style-iw-2em">AOP能够将那些与业务无关，<strong>却为业务模块所共同调用的逻辑或责任（例如事务处理、日志管理、权限控制等）封装起来</strong>，便于<strong>减少系统的重复代码</strong>，<strong>降低模块间的耦合度</strong>，并<strong>有利于未来的可拓展性和可维护性</strong>。</p>



<h4 class="wp-block-heading">AOP 当中的概念：</h4>



<ul class="wp-block-list"><li>切入点（Pointcut）<br>在哪些类，哪些方法上切入（<strong>where</strong>）</li><li>通知（Advice）<br>在方法执行的什么实际（<strong>when:</strong>方法前/方法后/方法前后）做什么（<strong>what:</strong>增强的功能）</li><li>切面（Aspect）<br>切面 = 切入点 + 通知，通俗点就是：<strong>在什么时机，什么地方，做什么增强！</strong></li><li>织入（Weaving）<br>把切面加入到对象，并创建出代理对象的过程。（由 Spring 来完成）</li></ul>



<h4 class="wp-block-heading">一个例子</h4>



<p class="is-style-iw-2em">为了更好的说明 AOP 的概念，我们来举一个实际中的例子来说明：</p>



<figure class="wp-block-image size-large"><img decoding="async" src="https://static.cztcode.com/15.webp" alt=""/></figure>



<p class="is-style-iw-2em">在上面的例子中，包租婆的核心业务就是签合同，收房租，那么这就够了，灰色框起来的部分都是重复且边缘的事，交给中介商就好了，这就是 <strong>AOP 的一个思想：让关注点代码与业务代码分离！</strong></p>



<h4 class="wp-block-heading">实际的代码</h4>



<p class="is-style-iw-2em">我们来实际的用代码感受一下</p>



<p class="is-style-iw-2em">1.在 Package【pojo】下新建一个【Landlord】类（我百度翻译的包租婆的英文）：<em></em></p>



<pre class="wp-block-code"><code>package pojo;

import org.springframework.stereotype.Component;

@Component("landlord")
public class Landlord {

    public void service() {
        // 仅仅只是实现了核心的业务功能
        System.out.println("签合同");
        System.out.println("收房租");
    }
}
</code></pre>



<p class="is-style-iw-2em">2.在 Package【aspect】下新建一个中介商【Broker】类（我还是用的翻译&#8230;）：<em></em></p>



<pre class="wp-block-code"><code>package aspect;

import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.stereotype.Component;

@Component
@Aspect
class Broker {

    @Before("execution(* pojo.Landlord.service())")
    public void before(){
        System.out.println("带租客看房");
        System.out.println("谈价格");
    }

    @After("execution(* pojo.Landlord.service())")
    public void after(){
        System.out.println("交钥匙");
    }
}
</code></pre>



<p class="is-style-iw-2em">3.在 applicationContext.xml 中配置自动注入，并告诉 Spring IoC 容器去哪里扫描这两个 Bean：<em></em></p>



<pre class="wp-block-code"><code>&lt;?xml version="1.0" encoding="UTF-8"?>
&lt;beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.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">

    &lt;context:component-scan base-package="aspect" />
    &lt;context:component-scan base-package="pojo" />

    &lt;aop:aspectj-autoproxy/>
&lt;/beans>
</code></pre>



<p class="is-style-iw-2em">4.在 Package【test】下编写测试代码：<em></em></p>



<pre class="wp-block-code"><code>package test;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import pojo.Landlord;

public class TestSpring {

    public static void main(String&#91;] args) {

        ApplicationContext context =
                new ClassPathXmlApplicationContext("applicationContext.xml");
        Landlord landlord = (Landlord) context.getBean("landlord", Landlord.class);
        landlord.service();

    }
}</code></pre>



<p class="is-style-iw-2em">5.执行看到效果：</p>



<figure class="wp-block-image size-large"><img decoding="async" src="https://static.cztcode.com/16.webp" alt=""/></figure>



<p class="is-style-iw-2em">这个例子使用了一些注解，现在看不懂没有关系，但我们可以从上面可以看到，我们在 Landlord 的 service() 方法中仅仅实现了核心的业务代码，其余的关注点功能是根据我们设置的切面<strong>自动补全</strong>的。</p>



<hr class="wp-block-separator"/>



<h2 class="wp-block-heading">使用注解来开发 Spring AOP</h2>



<p class="is-style-iw-2em">使用注解的方式已经逐渐成为了主流，所以我们利用上面的例子来说明如何用注解来开发 Spring AOP</p>



<h4 class="wp-block-heading">第一步：选择连接点</h4>



<p class="is-style-iw-2em">Spring 是方法级别的 AOP 框架，我们主要也是以某个类额某个方法作为连接点，另一种说法就是：<strong>选择哪一个类的哪一方法用以增强功能。</strong><em></em></p>



<pre class="wp-block-code"><code>    ....
    public void service() {
        // 仅仅只是实现了核心的业务功能
        System.out.println("签合同");
        System.out.println("收房租");
    }
    ....
</code></pre>



<p class="is-style-iw-2em">我们在这里就选择上述 Landlord 类中的 service() 方法作为连接点。</p>



<h4 class="wp-block-heading">第二步：创建切面</h4>



<p class="is-style-iw-2em">选择好了连接点就可以创建切面了，我们可以把切面理解为一个拦截器，当程序运行到连接点的时候，被拦截下来，在开头加入了初始化的方法，在结尾也加入了销毁的方法而已，在 Spring 中只要使用 <code>@Aspect</code> 注解一个类，那么 Spring IoC 容器就会认为这是一个切面了：<em></em></p>



<pre class="wp-block-code"><code>package aspect;

import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.stereotype.Component;

@Component
@Aspect
class Broker {

    @Before("execution(* pojo.Landlord.service())")
    public void before(){
        System.out.println("带租客看房");
        System.out.println("谈价格");
    }

    @After("execution(* pojo.Landlord.service())")
    public void after(){
        System.out.println("交钥匙");
    }
}
</code></pre>



<ul class="wp-block-list"><li><strong>注意：</strong> 被定义为切面的类仍然是一个 Bean ，需要 <code>@Component</code> 注解标注</li></ul>



<p class="is-style-iw-2em">代码部分中在方法上面的注解看名字也能猜出个大概，下面来列举一下 Spring 中的 AspectJ 注解：</p>



<figure class="wp-block-table"><table><thead><tr><th>注解</th><th>说明</th></tr></thead><tbody><tr><td><code>@Before</code></td><td>前置通知，在连接点方法前调用</td></tr><tr><td><code>@Around</code></td><td>环绕通知，它将覆盖原有方法，但是允许你通过反射调用原有方法，后面会讲</td></tr><tr><td><code>@After</code></td><td>后置通知，在连接点方法后调用</td></tr><tr><td><code>@AfterReturning</code></td><td>返回通知，在连接点方法执行并正常返回后调用，要求连接点方法在执行过程中没有发生异常</td></tr><tr><td><code>@AfterThrowing</code></td><td>异常通知，当连接点方法异常时调用</td></tr></tbody></table></figure>



<p class="is-style-iw-2em">有了上表，我们就知道 before() 方法是连接点方法调用前调用的方法，而 after() 方法则相反，这些注解中间使用了定义切点的正则式，也就是告诉 Spring AOP 需要拦截什么对象的什么方法，下面讲到。</p>



<h4 class="wp-block-heading">第三步：定义切点</h4>



<p class="is-style-iw-2em">在上面的注解中定义了 execution 的正则表达式，Spring 通过这个正则表达式判断具体要拦截的是哪一个类的哪一个方法：<em></em></p>



<pre class="wp-block-code"><code>execution(* pojo.Landlord.service())</code></pre>



<p class="is-style-iw-2em">依次对这个表达式作出分析：</p>



<ul class="wp-block-list"><li>execution：代表执行方法的时候会触发</li><li><code>*</code> ：代表任意返回类型的方法</li><li>pojo.Landlord：代表类的全限定名</li><li>service()：被拦截的方法名称</li></ul>



<p class="is-style-iw-2em">通过上面的表达式，Spring 就会知道应该拦截 pojo.Lnadlord 类下的 service() 方法。上面的演示类还好，如果多出都需要写这样的表达式难免会有些复杂，我们可以通过使用 <code>@Pointcut</code> 注解来定义一个切点来避免这样的麻烦：<em></em></p>



<pre class="wp-block-code"><code>package aspect;

import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;

@Component
@Aspect
class Broker {

    @Pointcut("execution(* pojo.Landlord.service())")
    public void lService() {
    }

    @Before("lService()")
    public void before() {
        System.out.println("带租客看房");
        System.out.println("谈价格");
    }

    @After("lService()")
    public void after() {
        System.out.println("交钥匙");
    }
}
</code></pre>



<h4 class="wp-block-heading">第四步：测试 AOP</h4>



<h4 class="wp-block-heading">环绕通知</h4>



<p class="is-style-iw-2em">我们来探讨一下环绕通知，这是 Spring AOP 中最强大的通知，因为它集成了前置通知和后置通知，它保留了连接点原有的方法的功能，所以它及强大又灵活，让我们来看看：<em></em></p>



<pre class="wp-block-code"><code>package aspect;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;

@Component
@Aspect
class Broker {

//  注释掉之前的 @Before 和 @After 注解以及对应的方法
//  @Before("execution(* pojo.Landlord.service())")
//  public void before() {
//      System.out.println("带租客看房");
//      System.out.println("谈价格");
//  }
//
//  @After("execution(* pojo.Landlord.service())")
//  public void after() {
//      System.out.println("交钥匙");
//  }

    //  使用 @Around 注解来同时完成前置和后置通知
    @Around("execution(* pojo.Landlord.service())")
    public void around(ProceedingJoinPoint joinPoint) {
        System.out.println("带租客看房");
        System.out.println("谈价格");

        try {
            joinPoint.proceed();
        } catch (Throwable throwable) {
            throwable.printStackTrace();
        }

        System.out.println("交钥匙");
    }
}
</code></pre>



<p class="is-style-iw-2em">运行测试代码，结果仍然正确.</p>



<hr class="wp-block-separator"/>



<h2 class="wp-block-heading">使用 XML 配置开发 Spring AOP</h2>



<p class="is-style-iw-2em">注解是很强大的东西，但基于 XML 的开发我们仍然需要了解，我们先来了解一下 AOP 中可以配置的元素：</p>



<figure class="wp-block-table"><table><thead><tr><th>AOP 配置元素</th><th>用途</th><th>备注</th></tr></thead><tbody><tr><td><code>aop:advisor</code></td><td>定义 AOP 的通知其</td><td>一种很古老的方式，很少使用</td></tr><tr><td><code>aop:aspect</code></td><td>定义一个切面</td><td>——</td></tr><tr><td><code>aop:before</code></td><td>定义前置通知</td><td>——</td></tr><tr><td><code>aop:after</code></td><td>定义后置通知</td><td>——</td></tr><tr><td><code>aop:around</code></td><td>定义环绕通知</td><td>——</td></tr><tr><td><code>aop:after-returning</code></td><td>定义返回通知</td><td>——</td></tr><tr><td><code>aop:after-throwing</code></td><td>定义异常通知</td><td>——</td></tr><tr><td><code>aop:config</code></td><td>顶层的 AOP 配置元素</td><td>AOP 的配置是以它为开始的</td></tr><tr><td><code>aop:declare-parents</code></td><td>给通知引入新的额外接口，增强功能</td><td>——</td></tr><tr><td><code>aop:pointcut</code></td><td>定义切点</td><td>——</td></tr></tbody></table></figure>



<p class="is-style-iw-2em">有了之前通过注解来编写的经验，并且有了上面的表，我们将上面的例子改写成 XML 配置很容易（去掉所有的注解）：<em></em></p>



<pre class="wp-block-code"><code>&lt;!-- 装配 Bean-->
&lt;bean name="landlord" class="pojo.Landlord"/>
&lt;bean id="broker" class="aspect.Broker"/>

&lt;!-- 配置AOP -->
&lt;aop:config>
    &lt;!-- where：在哪些地方（包.类.方法）做增加 -->
    &lt;aop:pointcut id="landlordPoint"
                  expression="execution(* pojo.Landlord.service())"/>
    &lt;!-- what:做什么增强 -->
    &lt;aop:aspect id="logAspect" ref="broker">
        &lt;!-- when:在什么时机（方法前/后/前后） -->
        &lt;aop:around pointcut-ref="landlordPoint" method="around"/>
    &lt;/aop:aspect>
&lt;/aop:config>
</code></pre>



<p class="is-style-iw-2em">作者：<a href="https://www.jianshu.com/p/994027425b44" target="_blank" rel="noopener">我没有三颗心脏</a></p>



<h2 class="wp-block-heading">IDEA配置</h2>



<p class="is-style-iw-2em">在创建项目时点击Spring项目即可快速创建。IDEA可以少导入很多jar包的，这里我添加进去缺少的两个。</p>



<pre class="wp-block-code"><code>&lt;dependency>
            &lt;groupId>commons-dbcp&lt;/groupId>
            &lt;artifactId>commons-dbcp&lt;/artifactId>
            &lt;version>&#91;1.4,)&lt;/version>
        &lt;/dependency>
        &lt;dependency>
            &lt;groupId>org.aspectj&lt;/groupId>
            &lt;artifactId>aspectjweaver&lt;/artifactId>
            &lt;version>1.9.5&lt;/version>
        &lt;/dependency>
        &lt;dependency>
            &lt;groupId>mysql&lt;/groupId>
            &lt;artifactId>mysql-connector-java&lt;/artifactId>
            &lt;version>8.0.20&lt;/version>
        &lt;/dependency></code></pre>



<p class="is-style-iw-2em">关于数据库的配置，例子里虽然没有用到：</p>



<pre class="wp-block-code"><code> &lt;tx:annotation-driven transaction-manager="transactionManager"/>

    &lt;bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        &lt;property name="dataSource" ref="mysql"/>
    &lt;/bean>


    &lt;bean id="mysql" class="org.apache.commons.dbcp.BasicDataSource">
        &lt;property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/>
        &lt;!-- schema_person是模式名，cj版本的驱动必须提前设置好时区-->
        &lt;property name="url"
                  value="jdbc:mysql://localhost:3306/jd_schema?useUnicode=true&amp;amp;characterEncoding=UTF-8&amp;amp;serverTimezone=UTC"/>
        &lt;property name="username" value="root"/>
        &lt;property name="password" value="  "/>
    &lt;/bean></code></pre>



<p class="is-style-iw-2em">创建项目的时候分号包。</p>



<ul class="wp-block-list"><li>aop中存放需要织入的方法</li><li>dao中存放Dao层的接口，对数据库的操作</li><li>entity存放实体类型</li><li>impl存放实现类</li><li>service存放主要实现代码</li></ul>



<figure class="wp-block-image size-large"><img decoding="async" src="https://www.cztcode.com/wp-content/uploads/2020/07/image-69.png" alt="" class="wp-image-3067"/></figure>



<h3 class="wp-block-heading">后置通知</h3>



<p class="is-style-iw-2em">后置通知和前置通知类似，接口更换为：</p>



<pre class="wp-block-code"><code>AfterReturningAdvice</code></pre>



<p class="is-style-iw-2em"></p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.cztcode.com/2020/3066/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">3066</post-id>	</item>
		<item>
		<title>IDEA创建Spring项目实现IOC</title>
		<link>https://www.cztcode.com/2020/2994/</link>
					<comments>https://www.cztcode.com/2020/2994/#respond</comments>
		
		<dc:creator><![CDATA[Jellow]]></dc:creator>
		<pubDate>Tue, 07 Jul 2020 04:48:31 +0000</pubDate>
				<category><![CDATA[Spring]]></category>
		<guid isPermaLink="false">https://www.cztcode.com/?p=2994</guid>

					<description><![CDATA[IOC全称: Inverse of Control, 控制反转,IOC其实不是什么技术，而是一种设计思想。简要的说就是：原本需要程序去主动new创建的对象，现在反转过来交给spring的容器去创建。]]></description>
										<content:encoded><![CDATA[<div id="bsf_rt_marker"></div>
<p class="is-style-iw-2em"><a href="https://www.ibm.com/developerworks/cn/java/wa-spring1/index.html" class="rank-math-link" target="_blank" rel="noopener">Spring</a>简介</p>



<h3 class="wp-block-heading">IOC</h3>



<p class="is-style-iw-2em">IOC全称: Inverse of Control, 控制反转,IOC其实不是什么技术，而是一种设计思想。</p>



<p class="is-style-iw-2em">简要的说就是：原本需要程序去主动new创建的对象，现在反转过来交给spring的容器去创建。</p>



<p class="is-style-iw-2em"><a href="https://blog.csdn.net/GoGleTech/article/details/79557416" class="rank-math-link" target="_blank" rel="noopener">什么是Spring IOC 和DI（最好的讲解）</a></p>



<h3 class="wp-block-heading">创建</h3>



<p class="is-style-iw-2em">IDEA创建Spring项目比eclipse简单了很多很多很多很多。</p>



<p class="is-style-iw-2em">首先打开IDEA，新建project，勾选新建Spring，点击Finish，完成。</p>



<figure class="wp-block-image size-large"><img decoding="async" src="https://www.cztcode.com/wp-content/uploads/2020/07/image-48-1024x722.png" alt="" class="wp-image-2995"/></figure>



<p class="is-style-iw-2em">IDEA会自动帮你下载需要的依赖。</p>



<p class="is-style-iw-2em">之后我们创建学生类，写出基本属性。</p>



<figure class="wp-block-image size-large"><img decoding="async" src="https://www.cztcode.com/wp-content/uploads/2020/07/image-49-1024x687.png" alt="" class="wp-image-2996"/></figure>



<p class="is-style-iw-2em">右键src创建spring的配置文件</p>



<figure class="wp-block-image size-large"><img decoding="async" src="https://www.cztcode.com/wp-content/uploads/2020/07/image-50-1024x733.png" alt="" class="wp-image-2997"/></figure>



<p class="is-style-iw-2em">在这里我们给创建的实例初始化值</p>



<pre class="wp-block-code"><code>&lt;?xml version="1.0" encoding="UTF-8"?>
&lt;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">
    &lt;bean id="student_chen" class="Student">
        &lt;property name="age" value="10"/>
        &lt;property name="name" value="chen"/>
        &lt;property name="number" value="01"/>
    &lt;/bean>
&lt;/beans></code></pre>



<p class="is-style-iw-2em">新建一个测试类，实例化对象。</p>



<pre class="wp-block-code"><code>import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Main {
  public static void main(String&#91;] args) {
    ApplicationContext app = new ClassPathXmlApplicationContext("bean.xml");
    Student student = (Student) app.getBean("student_chen");
    System.out.println(student.toString());
  }
}
</code></pre>



<figure class="wp-block-image size-large"><img decoding="async" src="https://www.cztcode.com/wp-content/uploads/2020/07/image-51-1024x516.png" alt="" class="wp-image-2998"/></figure>



<p class="is-style-iw-2em">完成。</p>



<p class="is-style-iw-2em">如果类之间有继承关系，使用ref引用</p>



<figure class="wp-block-image size-large"><img decoding="async" src="https://www.cztcode.com/wp-content/uploads/2020/07/image-55.png" alt="" class="wp-image-3016"/></figure>



<h3 class="wp-block-heading">使用constructor</h3>



<p class="is-style-iw-2em">使用构造器创建对象，上面的方法使用的是setter方法。</p>



<pre class="wp-block-code"><code>&lt;bean id="classes_02" class="Classes">
        &lt;constructor-arg value="02"/>
        &lt;constructor-arg ref="teacher_li"/>
    &lt;/bean></code></pre>



<p class="is-style-iw-2em">顺序与构造方法中的顺序一致，当然也可以手动指定顺序</p>



<pre class="wp-block-code"><code>&lt;bean id="classes_02" class="Classes">
        &lt;constructor-arg value="02" index="0"/>
        &lt;constructor-arg ref="teacher_li" index="1"/>
    &lt;/bean></code></pre>



<p class="is-style-iw-2em">使用name指定，感觉比index方便</p>



<pre class="wp-block-code"><code>  &lt;bean id="classes_02" class="Classes">
        &lt;constructor-arg value="02" index="0" name="num"/>
        &lt;constructor-arg ref="teacher_li" index="1" name="teacher"/>
    &lt;/bean></code></pre>



<h4 class="wp-block-heading">数组属性类型的注入</h4>



<pre class="wp-block-code"><code>
 &lt;bean id="abcd" class="ABCD">
        &lt;property name="array">
            &lt;array>
                &lt;value>czt&lt;/value>
                &lt;value>slh&lt;/value>
            &lt;/array>
        &lt;/property>
        &lt;property name="arrayList">
            &lt;array>
                &lt;value>czt&lt;/value>
                &lt;value>slh&lt;/value>
            &lt;/array>
        &lt;/property>
        &lt;property name="map" >
            &lt;map>
            &lt;entry key="chen" value="01"/>
        &lt;/map>
        &lt;/property>
    &lt;/bean>
&lt;/beans></code></pre>



<figure class="wp-block-image size-large"><img decoding="async" src="https://www.cztcode.com/wp-content/uploads/2020/07/image-56.png" alt="" class="wp-image-3022"/></figure>



<h5 class="wp-block-heading">value中的字符串空值，直接写</h5>



<pre class="wp-block-code"><code>&lt;null/></code></pre>



<h5 class="wp-block-heading">使用构造方法赋值</h5>



<p class="is-style-iw-2em"><strong>使用IOC时，类中必须有无参构造方法</strong></p>



<p class="is-style-iw-2em">构造方法赋值和普通类型的属性方式相同</p>



<h4 class="wp-block-heading">使用autowire自动注入</h4>



<pre class="wp-block-code"><code>  &lt;bean id="teacher" class="Teacher">
        &lt;property name="name" value="li"/>
        &lt;property name="sex" value="女"/>
     &lt;/bean>

    &lt;bean id="classes_02" class="Classes" autowire="byName">
      &lt;property name="num" value="02"/>
    &lt;/bean></code></pre>



<p class="is-style-iw-2em">若类中属性名和Bean的id相同，将会自动注入</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.cztcode.com/2020/2994/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">2994</post-id>	</item>
		<item>
		<title>静态资源和动态资源的访问</title>
		<link>https://www.cztcode.com/2020/1547/</link>
					<comments>https://www.cztcode.com/2020/1547/#respond</comments>
		
		<dc:creator><![CDATA[Jellow]]></dc:creator>
		<pubDate>Sun, 19 Apr 2020 08:52:29 +0000</pubDate>
				<category><![CDATA[Spring]]></category>
		<category><![CDATA[Spring boot]]></category>
		<guid isPermaLink="false">https://www.cztcode.com/?p=1547</guid>

					<description><![CDATA[静态资源和动态资源的访问。]]></description>
										<content:encoded><![CDATA[<div id="bsf_rt_marker"></div>
<p>知识存储</p>



<h3 class="wp-block-heading">静态资源路径：</h3>



<p>而spring boot静态资源路径如下：（其中classpath为src.resources文件夹下）</p>



<pre class="wp-block-code"><code>"classpath: /META-INF/resources/", 
"classpath: /resources/",
"classpath: /static/", 
"classpath: /public/" 
"/"：当前项目的根路径</code></pre>



<figure class="wp-block-image size-large"><img decoding="async" src="https://www.cztcode.com/wp-content/uploads/2020/04/image-11.png" alt="" class="wp-image-1561"/></figure>



<h3 class="wp-block-heading">欢迎页映射规则：</h3>



<p>以“/**”的方式映射，系统会默认访问静态资源下的index.html文件</p>



<p>例如：</p>



<figure class="wp-block-image size-large"><img fetchpriority="high" decoding="async" width="1024" height="322" src="https://www.cztcode.com/wp-content/uploads/2020/04/image-7-1024x322.png" alt="" class="wp-image-1550" srcset="https://www.cztcode.com/wp-content/uploads/2020/04/image-7-1024x322.png 1024w, https://www.cztcode.com/wp-content/uploads/2020/04/image-7-300x94.png 300w, https://www.cztcode.com/wp-content/uploads/2020/04/image-7-768x242.png 768w, https://www.cztcode.com/wp-content/uploads/2020/04/image-7-1536x483.png 1536w, https://www.cztcode.com/wp-content/uploads/2020/04/image-7.png 1857w" sizes="(max-width: 1024px) 100vw, 1024px" /><figcaption>文件在resource.static文件夹下</figcaption></figure>



<p>localhost:8080/（当静态文件夹中有index.html文件时，才可以映射到）</p>



<figure class="wp-block-image size-large"><img decoding="async" src="https://www.cztcode.com/wp-content/uploads/2020/04/image-8.png" alt="" class="wp-image-1555"/></figure>



<h3 class="wp-block-heading">动态资源</h3>



<p>之前讲的thymeleaf便是模板引擎，用来动态渲染</p>



<p>只要我们把HTML页面放在classpath:/templates/，thymeleaf就能自动渲染；</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.cztcode.com/2020/1547/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">1547</post-id>	</item>
		<item>
		<title>spring boot——Thymeleaf模板引擎的使用</title>
		<link>https://www.cztcode.com/2020/1369/</link>
					<comments>https://www.cztcode.com/2020/1369/#respond</comments>
		
		<dc:creator><![CDATA[Jellow]]></dc:creator>
		<pubDate>Sun, 19 Apr 2020 08:47:45 +0000</pubDate>
				<category><![CDATA[Spring]]></category>
		<category><![CDATA[Spring boot]]></category>
		<guid isPermaLink="false">https://www.cztcode.com/?p=1369</guid>

					<description><![CDATA[spring boot——Thymeleaf模板引擎的使用，本章仅仅只是简单入门Thymeleaf。]]></description>
										<content:encoded><![CDATA[<div id="bsf_rt_marker"></div>
<p>本章仅仅只是简单入门Thymeleaf。</p>



<p>之前学习的是jsp，但是现在不是很推荐使用jsp来实现网页页面效果。但是还走了不少弯路。 简单说，Thymeleaf 是一个跟 Velocity、FreeMarker 类似的模板引擎，它可以完全替代 JSP 。 推荐详细介绍网址：<em>https://www.cnblogs.com/ityouknow/p/5833560.html</em></p>



<h2 class="wp-block-heading">快速创建spring boot项目</h2>



<figure class="wp-block-image size-large"><img decoding="async" width="1024" height="812" src="https://www.cztcode.com/wp-content/uploads/2020/03/LC7@8094F_@_1B07XTC-1024x812.png" alt="" class="wp-image-1370" srcset="https://www.cztcode.com/wp-content/uploads/2020/03/LC7@8094F_@_1B07XTC-1024x812.png 1024w, https://www.cztcode.com/wp-content/uploads/2020/03/LC7@8094F_@_1B07XTC-300x238.png 300w, https://www.cztcode.com/wp-content/uploads/2020/03/LC7@8094F_@_1B07XTC-768x609.png 768w, https://www.cztcode.com/wp-content/uploads/2020/03/LC7@8094F_@_1B07XTC.png 1274w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<h4 class="wp-block-heading">选择相应的jar包组件</h4>



<figure class="wp-block-image size-large"><img decoding="async" width="1024" height="812" src="https://www.cztcode.com/wp-content/uploads/2020/03/Y0WJSV1PQWWJK88I4-1024x812.png" alt="" class="wp-image-1371" srcset="https://www.cztcode.com/wp-content/uploads/2020/03/Y0WJSV1PQWWJK88I4-1024x812.png 1024w, https://www.cztcode.com/wp-content/uploads/2020/03/Y0WJSV1PQWWJK88I4-300x238.png 300w, https://www.cztcode.com/wp-content/uploads/2020/03/Y0WJSV1PQWWJK88I4-768x609.png 768w, https://www.cztcode.com/wp-content/uploads/2020/03/Y0WJSV1PQWWJK88I4.png 1274w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<h2 class="wp-block-heading">添加依赖</h2>



<h4 class="wp-block-heading">寻找依赖的网站：  <a class="rank-math-link rank-math-link" href="https://mvnrepository.com/" target="_blank" rel="noopener">点击这里</a> </h4>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="615" src="https://www.cztcode.com/wp-content/uploads/2020/03/HYVRY5K5L53IIFVY6C-1024x615.png" alt="" class="wp-image-1373" srcset="https://www.cztcode.com/wp-content/uploads/2020/03/HYVRY5K5L53IIFVY6C-1024x615.png 1024w, https://www.cztcode.com/wp-content/uploads/2020/03/HYVRY5K5L53IIFVY6C-300x180.png 300w, https://www.cztcode.com/wp-content/uploads/2020/03/HYVRY5K5L53IIFVY6C-768x461.png 768w, https://www.cztcode.com/wp-content/uploads/2020/03/HYVRY5K5L53IIFVY6C-1536x923.png 1536w, https://www.cztcode.com/wp-content/uploads/2020/03/HYVRY5K5L53IIFVY6C.png 1578w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="615" src="https://www.cztcode.com/wp-content/uploads/2020/03/2CQE6BMXRN11QV@JRXD-1024x615.png" alt="" class="wp-image-1374" srcset="https://www.cztcode.com/wp-content/uploads/2020/03/2CQE6BMXRN11QV@JRXD-1024x615.png 1024w, https://www.cztcode.com/wp-content/uploads/2020/03/2CQE6BMXRN11QV@JRXD-300x180.png 300w, https://www.cztcode.com/wp-content/uploads/2020/03/2CQE6BMXRN11QV@JRXD-768x462.png 768w, https://www.cztcode.com/wp-content/uploads/2020/03/2CQE6BMXRN11QV@JRXD-1536x923.png 1536w, https://www.cztcode.com/wp-content/uploads/2020/03/2CQE6BMXRN11QV@JRXD.png 1574w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="613" src="https://www.cztcode.com/wp-content/uploads/2020/03/POWB@CIFS5G31U2GH-1024x613.png" alt="" class="wp-image-1375" srcset="https://www.cztcode.com/wp-content/uploads/2020/03/POWB@CIFS5G31U2GH-1024x613.png 1024w, https://www.cztcode.com/wp-content/uploads/2020/03/POWB@CIFS5G31U2GH-300x180.png 300w, https://www.cztcode.com/wp-content/uploads/2020/03/POWB@CIFS5G31U2GH-768x460.png 768w, https://www.cztcode.com/wp-content/uploads/2020/03/POWB@CIFS5G31U2GH-1536x920.png 1536w, https://www.cztcode.com/wp-content/uploads/2020/03/POWB@CIFS5G31U2GH.png 1576w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<h4 class="wp-block-heading">需要的依赖</h4>



<pre class="wp-block-code"><code>&lt;!-- https://mvnrepository.com/artifact/org.thymeleaf/thymeleaf -->
&lt;dependency>
    &lt;groupId>org.thymeleaf&lt;/groupId>
    &lt;artifactId>thymeleaf&lt;/artifactId>
    &lt;version>3.0.11.RELEASE&lt;/version>
&lt;/dependency>
</code></pre>



<h2 class="wp-block-heading">尝试运行</h2>



<figure class="wp-block-image size-large"><img decoding="async" src="https://www.cztcode.com/wp-content/uploads/2020/03/@GN6WN2B9N@NTOOY7CN-1024x672.png" alt="" class="wp-image-1372"/></figure>



<h2 class="wp-block-heading">编写ThymeleafController文件</h2>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="464" src="https://www.cztcode.com/wp-content/uploads/2020/04/image-9-1024x464.png" alt="" class="wp-image-1558" srcset="https://www.cztcode.com/wp-content/uploads/2020/04/image-9-1024x464.png 1024w, https://www.cztcode.com/wp-content/uploads/2020/04/image-9-300x136.png 300w, https://www.cztcode.com/wp-content/uploads/2020/04/image-9-768x348.png 768w, https://www.cztcode.com/wp-content/uploads/2020/04/image-9-1536x696.png 1536w, https://www.cztcode.com/wp-content/uploads/2020/04/image-9.png 1846w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<pre class="wp-block-code"><code>import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

@Controller

public class ThymeleafController {

    /**
     * Spring Boot默认存放模板页面的路径在src/main/resources/templates或者src/main/view/templates
     * 所以它会自动去访问src/main/resources/templates/show（return中的内容）.html
     * @return
     */

    @RequestMapping(value = "show",method = RequestMethod.GET)
    public String show(){
        return "show";
    }
}</code></pre>



<h2 class="wp-block-heading">编写HTML文件</h2>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="671" src="https://www.cztcode.com/wp-content/uploads/2020/03/QQQUS4L026AICELUA16-1024x671.png" alt="" class="wp-image-1377" srcset="https://www.cztcode.com/wp-content/uploads/2020/03/QQQUS4L026AICELUA16-1024x671.png 1024w, https://www.cztcode.com/wp-content/uploads/2020/03/QQQUS4L026AICELUA16-300x196.png 300w, https://www.cztcode.com/wp-content/uploads/2020/03/QQQUS4L026AICELUA16-768x503.png 768w, https://www.cztcode.com/wp-content/uploads/2020/03/QQQUS4L026AICELUA16-1536x1006.png 1536w, https://www.cztcode.com/wp-content/uploads/2020/03/QQQUS4L026AICELUA16.png 1579w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<pre class="wp-block-code"><code>&lt;!DOCTYPE HTML>
&lt;html xmlns:th="http://www.thymeleaf.org">
&lt;head>
    &lt;title>SpringBoot模板渲染&lt;/title>
    &lt;meta http-equiv="Content-Type" content="text/html;charset=UTF-8"/>
&lt;/head>
&lt;body>
    &lt;h1>成功!&lt;/h1>
&lt;/body>
&lt;/html></code></pre>



<p>&lt;html xmlns:th=&#8221;http://www.thymeleaf.org&#8221;&gt;</p>



<p>导入thymeleaf的名称空间，可以用于检查代码的正确性</p>



<h2 class="wp-block-heading">显示效果</h2>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="570" height="221" src="https://www.cztcode.com/wp-content/uploads/2020/03/19GLYVOWAE@G@_Q3M1OVM.png" alt="" class="wp-image-1378" srcset="https://www.cztcode.com/wp-content/uploads/2020/03/19GLYVOWAE@G@_Q3M1OVM.png 570w, https://www.cztcode.com/wp-content/uploads/2020/03/19GLYVOWAE@G@_Q3M1OVM-300x116.png 300w" sizes="(max-width: 570px) 100vw, 570px" /></figure>



<h2 class="wp-block-heading">@Controller的理解</h2>



<pre class="wp-block-code"><code>@Controller
/**
 * 1.在controller类中，@Controller配合视图解析器InternalResourceViewResolver，
 *   返回的内容就是return中的内容的html文件（即show.html），显示show.html页面
 * 2.@RestController注释Controller类，则方法无法返回jsp页面，
 *   将会直接将return中的内容展示成json格式
 */</code></pre>



<p>thymeleaf的语法等之后详细介绍</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.cztcode.com/2020/1369/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">1369</post-id>	</item>
		<item>
		<title>简写第一个spring boot项目</title>
		<link>https://www.cztcode.com/2020/3900/</link>
					<comments>https://www.cztcode.com/2020/3900/#respond</comments>
		
		<dc:creator><![CDATA[Jellow]]></dc:creator>
		<pubDate>Sat, 21 Mar 2020 02:26:44 +0000</pubDate>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Spring]]></category>
		<category><![CDATA[Spring boot]]></category>
		<guid isPermaLink="false">https://www.cztcode.com/?p=1274</guid>

					<description><![CDATA[简写第一个spring boot项目。感受一下spring boot功能的强大，有了感觉再慢慢入门。]]></description>
										<content:encoded><![CDATA[<div id="bsf_rt_marker"></div>
<p>先感受一下spring boot功能的强大，有了感觉再慢慢入门。</p>



<span id="more-3900"></span>



<h2 class="wp-block-heading">开发工具：</h2>



<h3 class="wp-block-heading">IDEA</h3>



<h2 class="wp-block-heading">构建项目</h2>



<p>直接构造一个项目，将自己需要的功能直接加到spring boot的项目框架中，例如web，mysql等。这就是spring boot便捷处之一</p>



<p>1.可以使用spring官网 SPRING INITIALIZR来构造项目。</p>



<p>2.直接使用IDEA开发工具来构建项目。</p>



<h3 class="wp-block-heading">使用spring官网SPRING INITIALIZR来构造项目</h3>



<h4 class="wp-block-heading">首先打开官网 <a href="https://spring.io/projects/spring-boot" target="_blank" rel="noopener">https://spring.io/projects/spring-boot</a> </h4>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="650" src="https://www.cztcode.com/wp-content/uploads/2020/03/UD7PMRFQGKA2KFO20II-1024x650.png" alt="" class="wp-image-1275" srcset="https://www.cztcode.com/wp-content/uploads/2020/03/UD7PMRFQGKA2KFO20II-1024x650.png 1024w, https://www.cztcode.com/wp-content/uploads/2020/03/UD7PMRFQGKA2KFO20II-300x190.png 300w, https://www.cztcode.com/wp-content/uploads/2020/03/UD7PMRFQGKA2KFO20II-768x487.png 768w, https://www.cztcode.com/wp-content/uploads/2020/03/UD7PMRFQGKA2KFO20II.png 1417w" sizes="(max-width: 1024px) 100vw, 1024px" /><figcaption>上图便是spring官网,接着滑到Quickstart Your Project,点击spring initializr.</figcaption></figure>



<figure class="wp-block-image size-large"><img decoding="async" src="https://www.cztcode.com/wp-content/uploads/2020/03/PO1035ZVFHSXOC_S20DIS-1024x627.png" alt="" class="wp-image-1276"/></figure>



<h4 class="wp-block-heading">其次,按照你的需要选择不同的依赖,进行创建</h4>



<p>依赖:便是利用各功能jar包,将需要的功能引进自己的项目中.例如web jar包,便是使用了网页展示的功能.</p>



<figure class="wp-block-image size-large"><img decoding="async" src="https://www.cztcode.com/wp-content/uploads/2020/03/A@6@ZHX1_@OXQIU6DRI6R-1024x643.png" alt="" class="wp-image-1277"/></figure>



<figure class="wp-block-image size-large"><img decoding="async" src="https://www.cztcode.com/wp-content/uploads/2020/03/ZDEBR6UHBT@KWVNIE-1024x622.png" alt="" class="wp-image-1278"/></figure>



<figure class="wp-block-image size-large"><img decoding="async" src="https://www.cztcode.com/wp-content/uploads/2020/03/2IDKIOZUTLKVF9-1024x628.png" alt="" class="wp-image-1279"/></figure>



<h4 class="wp-block-heading">然后,便将此压缩包下载到自己合适的文件夹中解压后,点击文件夹,便会看到如此模样</h4>



<figure class="wp-block-image size-large"><img decoding="async" src="https://www.cztcode.com/wp-content/uploads/2020/03/WQER4PWB8@GIMSX.png" alt="" class="wp-image-1280"/><figcaption>各个文件的具体作用,待会儿细说</figcaption></figure>



<p>之后在IntelliJ IDBA中点击file-&gt;open,便可以使用了</p>



<h3 class="wp-block-heading"> 直接使用IDEA开发工具来构建项目。 </h3>



<h4 class="wp-block-heading"> 首先，打开 IntelliJ IDEA，点击Create New Project</h4>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="643" src="https://www.cztcode.com/wp-content/uploads/2020/03/AQD4UWBDIIXMR1RVW27P-1024x643.png" alt="" class="wp-image-1308" srcset="https://www.cztcode.com/wp-content/uploads/2020/03/AQD4UWBDIIXMR1RVW27P-1024x643.png 1024w, https://www.cztcode.com/wp-content/uploads/2020/03/AQD4UWBDIIXMR1RVW27P-300x188.png 300w, https://www.cztcode.com/wp-content/uploads/2020/03/AQD4UWBDIIXMR1RVW27P-768x482.png 768w, https://www.cztcode.com/wp-content/uploads/2020/03/AQD4UWBDIIXMR1RVW27P.png 1167w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<h4 class="wp-block-heading">其次，选择Spring Initializr，点击next。</h4>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="814" src="https://www.cztcode.com/wp-content/uploads/2020/03/8GUZIATTVAUS@DTW2CHTX6-1024x814.png" alt="" class="wp-image-1310" srcset="https://www.cztcode.com/wp-content/uploads/2020/03/8GUZIATTVAUS@DTW2CHTX6-1024x814.png 1024w, https://www.cztcode.com/wp-content/uploads/2020/03/8GUZIATTVAUS@DTW2CHTX6-300x238.png 300w, https://www.cztcode.com/wp-content/uploads/2020/03/8GUZIATTVAUS@DTW2CHTX6-768x610.png 768w, https://www.cztcode.com/wp-content/uploads/2020/03/8GUZIATTVAUS@DTW2CHTX6.png 1271w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<h4 class="wp-block-heading">接着，修改一下文件名，我们是以helloworld为例，其中的Language是我们使用的编程语言，Packaging是我们打包的形式。接着点击next。</h4>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="814" src="https://www.cztcode.com/wp-content/uploads/2020/03/9PABIHJHFPKBCS5FRS-1024x814.png" alt="" class="wp-image-1311" srcset="https://www.cztcode.com/wp-content/uploads/2020/03/9PABIHJHFPKBCS5FRS-1024x814.png 1024w, https://www.cztcode.com/wp-content/uploads/2020/03/9PABIHJHFPKBCS5FRS-300x238.png 300w, https://www.cztcode.com/wp-content/uploads/2020/03/9PABIHJHFPKBCS5FRS-768x610.png 768w, https://www.cztcode.com/wp-content/uploads/2020/03/9PABIHJHFPKBCS5FRS.png 1271w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<h4 class="wp-block-heading">然后，便是选择你想要的dependencies依赖了，我们在这里选择web依赖。我们所选中的 dependencies 会在Eelected Dependencies中显示出来。</h4>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="814" src="https://www.cztcode.com/wp-content/uploads/2020/03/1_JIQ2DQW3_28_LJ3-1024x814.png" alt="" class="wp-image-1312" srcset="https://www.cztcode.com/wp-content/uploads/2020/03/1_JIQ2DQW3_28_LJ3-1024x814.png 1024w, https://www.cztcode.com/wp-content/uploads/2020/03/1_JIQ2DQW3_28_LJ3-300x238.png 300w, https://www.cztcode.com/wp-content/uploads/2020/03/1_JIQ2DQW3_28_LJ3-768x610.png 768w, https://www.cztcode.com/wp-content/uploads/2020/03/1_JIQ2DQW3_28_LJ3.png 1271w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<h3 class="wp-block-heading">接着选择你存放的位置，建议放在一个专门写spring boot的文件中，文件管理很重要。</h3>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="814" src="https://www.cztcode.com/wp-content/uploads/2020/03/N6NLLZ7UVM0IZV86907-1024x814.png" alt="" class="wp-image-1313" srcset="https://www.cztcode.com/wp-content/uploads/2020/03/N6NLLZ7UVM0IZV86907-1024x814.png 1024w, https://www.cztcode.com/wp-content/uploads/2020/03/N6NLLZ7UVM0IZV86907-300x238.png 300w, https://www.cztcode.com/wp-content/uploads/2020/03/N6NLLZ7UVM0IZV86907-768x610.png 768w, https://www.cztcode.com/wp-content/uploads/2020/03/N6NLLZ7UVM0IZV86907.png 1271w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<h3 class="wp-block-heading">呈现的效果：</h3>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="712" src="https://www.cztcode.com/wp-content/uploads/2020/03/D0A226_Z@VCZ1RX7DMWO-1024x712.png" alt="" class="wp-image-1315" srcset="https://www.cztcode.com/wp-content/uploads/2020/03/D0A226_Z@VCZ1RX7DMWO-1024x712.png 1024w, https://www.cztcode.com/wp-content/uploads/2020/03/D0A226_Z@VCZ1RX7DMWO-300x209.png 300w, https://www.cztcode.com/wp-content/uploads/2020/03/D0A226_Z@VCZ1RX7DMWO-768x534.png 768w, https://www.cztcode.com/wp-content/uploads/2020/03/D0A226_Z@VCZ1RX7DMWO.png 1486w" sizes="(max-width: 1024px) 100vw, 1024px" /><figcaption>记得点击Enable Auto—Import，可以自动下载你添加的各种jar包</figcaption></figure>



<h2 class="wp-block-heading">了解部分spring boot结构功能</h2>



<p><strong>了解某些类和注解（@后的）的具体内容，可以按住ctrl，然后点击你想了解的类的内容。</strong></p>



<h3 class="wp-block-heading">生成的文件解释：</h3>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="629" src="https://www.cztcode.com/wp-content/uploads/2020/03/AGNQ1EF0GA7LSN8ML-1024x629.png" alt="" class="wp-image-1318" srcset="https://www.cztcode.com/wp-content/uploads/2020/03/AGNQ1EF0GA7LSN8ML-1024x629.png 1024w, https://www.cztcode.com/wp-content/uploads/2020/03/AGNQ1EF0GA7LSN8ML-300x184.png 300w, https://www.cztcode.com/wp-content/uploads/2020/03/AGNQ1EF0GA7LSN8ML-768x472.png 768w, https://www.cztcode.com/wp-content/uploads/2020/03/AGNQ1EF0GA7LSN8ML-1536x944.png 1536w, https://www.cztcode.com/wp-content/uploads/2020/03/AGNQ1EF0GA7LSN8ML.png 1683w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<ul class="wp-block-list"><li> HelloWorldApplication&nbsp; 该类是程序的入口类内有个main方法，可以直接通过run as运行项目</li><li>application.properties&nbsp; 该配置文件是项目的核心配置文件，以xx.xx.xx的形式存在</li><li>pom.xml&nbsp; maven配置文件，因为我们采用的maven管理jar，所以这里会自动生成一个pom文件</li><li> HelloWorldApplicationTest 测试入口</li></ul>



<h3 class="wp-block-heading">@SpringBootApplication注解</h3>



<figure class="wp-block-image size-large is-resized"><img loading="lazy" decoding="async" src="https://www.cztcode.com/wp-content/uploads/2020/03/BEB51D27B71CCEAAF6339C74AD141A3D.jpg" alt="" class="wp-image-1332" width="667" height="352"/><figcaption>按住Ctrl，移动到注释旁，便会出现可以点击的图样</figcaption></figure>



<figure class="wp-block-image size-large is-resized"><img loading="lazy" decoding="async" src="https://www.cztcode.com/wp-content/uploads/2020/03/SOLU6FQB@B_HZIDJ-1024x621.png" alt="" class="wp-image-1333" width="667" height="404"/></figure>



<p>可以看到@SpringBootApplication内部的内容，里面也是使用的许多注释，现在咱们只需要简单的知道它是代码运行的入口。放着main函数之前，也只能使用一次。程序是通过它，找到主函数，开始运行的。</p>



<h2 class="wp-block-heading">运行现有的框架,看看效果</h2>



<figure class="wp-block-image size-large is-resized"><img loading="lazy" decoding="async" src="https://www.cztcode.com/wp-content/uploads/2020/03/3730D13D3D97796497AB51E4BEBCDDF2.jpg" alt="" class="wp-image-1334" width="667" height="396"/><figcaption>右键鼠标，点击run</figcaption></figure>



<figure class="wp-block-image size-large is-resized"><img loading="lazy" decoding="async" src="https://www.cztcode.com/wp-content/uploads/2020/03/CAEC8CC4C743A0F5CCB0512288FCFF5E.jpg" alt="" class="wp-image-1335" width="681" height="356"/><figcaption>可以看到Tomcat容器开启了，端口为8080（端口8080可以修改，之后会讲解）</figcaption></figure>



<p>Tomcat简介： 全世界最著名的基于Java语言的轻量级应用服务器，是一款完全开源免费的Servlet容器实现。同时，它支持HTML、JS等静态资源的处理，因此又可以作为轻量级Web服务器使用。 </p>



<figure class="wp-block-image size-large"><img decoding="async" src="https://www.cztcode.com/wp-content/uploads/2020/03/SEUUQI6STAIH@ZZYAF2.png" alt="" class="wp-image-1336"/></figure>



<p>在浏览器的地址栏输入127.0.0.1:8080，或者localhost:8080。便会看到一个显示错误页面。这是我们还没有向他发出请求，所以显示错误页面，那接下来我们开始书写代码吧</p>



<h2 class="wp-block-heading">开始编写第一个代码</h2>



<figure class="wp-block-image size-large is-resized"><img loading="lazy" decoding="async" src="https://www.cztcode.com/wp-content/uploads/2020/03/LR5A4YGNNBRPSYN6T-1024x576.png" alt="" class="wp-image-1339" width="681" height="383" srcset="https://www.cztcode.com/wp-content/uploads/2020/03/LR5A4YGNNBRPSYN6T-1024x576.png 1024w, https://www.cztcode.com/wp-content/uploads/2020/03/LR5A4YGNNBRPSYN6T-300x169.png 300w, https://www.cztcode.com/wp-content/uploads/2020/03/LR5A4YGNNBRPSYN6T-768x432.png 768w, https://www.cztcode.com/wp-content/uploads/2020/03/LR5A4YGNNBRPSYN6T-1536x864.png 1536w, https://www.cztcode.com/wp-content/uploads/2020/03/LR5A4YGNNBRPSYN6T.png 1920w" sizes="(max-width: 681px) 100vw, 681px" /></figure>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="957" height="502" src="https://www.cztcode.com/wp-content/uploads/2020/03/5FD67C7C4851CBD8C220028B99EBFDD1.jpg" alt="" class="wp-image-1340" srcset="https://www.cztcode.com/wp-content/uploads/2020/03/5FD67C7C4851CBD8C220028B99EBFDD1.jpg 957w, https://www.cztcode.com/wp-content/uploads/2020/03/5FD67C7C4851CBD8C220028B99EBFDD1-300x157.jpg 300w, https://www.cztcode.com/wp-content/uploads/2020/03/5FD67C7C4851CBD8C220028B99EBFDD1-768x403.jpg 768w" sizes="(max-width: 957px) 100vw, 957px" /></figure>



<p> 在main.java.com.example下的helloworld文件下创建一个controller文件，文件内创建一个HelloWorldController的Java文件。 注意controller文件是与HelloWorldApplication文件在同一级。</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="631" src="https://www.cztcode.com/wp-content/uploads/2020/03/ND2YTVWRW@0P8KGU4VJ-1024x631.png" alt="" class="wp-image-1345" srcset="https://www.cztcode.com/wp-content/uploads/2020/03/ND2YTVWRW@0P8KGU4VJ-1024x631.png 1024w, https://www.cztcode.com/wp-content/uploads/2020/03/ND2YTVWRW@0P8KGU4VJ-300x185.png 300w, https://www.cztcode.com/wp-content/uploads/2020/03/ND2YTVWRW@0P8KGU4VJ-768x473.png 768w, https://www.cztcode.com/wp-content/uploads/2020/03/ND2YTVWRW@0P8KGU4VJ-1536x946.png 1536w, https://www.cztcode.com/wp-content/uploads/2020/03/ND2YTVWRW@0P8KGU4VJ.png 1679w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p>如图编写代码</p>



<pre class="wp-block-code"><code>import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping
public class HelloWorldController {
    @RequestMapping(value = "/hello",method = RequestMethod.GET)
    public String index(){
        return "HelloWorld!";
    }
}</code></pre>



<h2 class="wp-block-heading">运行代码</h2>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="921" height="287" src="https://www.cztcode.com/wp-content/uploads/2020/03/VT4__ZZLJV_YNK4_8AEK.png" alt="" class="wp-image-1342" srcset="https://www.cztcode.com/wp-content/uploads/2020/03/VT4__ZZLJV_YNK4_8AEK.png 921w, https://www.cztcode.com/wp-content/uploads/2020/03/VT4__ZZLJV_YNK4_8AEK-300x93.png 300w, https://www.cztcode.com/wp-content/uploads/2020/03/VT4__ZZLJV_YNK4_8AEK-768x239.png 768w" sizes="(max-width: 921px) 100vw, 921px" /><figcaption>点击run运行（注意要关闭之前的项目）</figcaption></figure>



<h2 class="wp-block-heading">代码分析</h2>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="948" height="767" src="https://www.cztcode.com/wp-content/uploads/2020/03/EWAW5TA0DAU38M045S.png" alt="" class="wp-image-1341" srcset="https://www.cztcode.com/wp-content/uploads/2020/03/EWAW5TA0DAU38M045S.png 948w, https://www.cztcode.com/wp-content/uploads/2020/03/EWAW5TA0DAU38M045S-300x243.png 300w, https://www.cztcode.com/wp-content/uploads/2020/03/EWAW5TA0DAU38M045S-768x621.png 768w" sizes="(max-width: 948px) 100vw, 948px" /></figure>



<h4 class="wp-block-heading">@RestController</h4>



<pre class="wp-block-preformatted">@RestController 的效果相当于<em>@Controller + @ResponseBody
在返回json（JavaSpring Objection Notation）数据需要 @RestController</em></pre>



<h4 class="wp-block-heading">@RequestMapping</h4>



<p>可以标注在类上，也可以直接标注在方法上。建议在类上也写上</p>



<p>这一章节结束了，下一章准备写<em>Thymeleaf模板引擎</em>的使用</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.cztcode.com/2020/3900/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">3900</post-id>	</item>
	</channel>
</rss>
