﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-Terry Zou-随笔分类-spring</title><link>http://www.blogjava.net/ZouYonghui/category/55353.html</link><description /><language>zh-cn</language><lastBuildDate>Thu, 09 Apr 2020 15:45:49 GMT</lastBuildDate><pubDate>Thu, 09 Apr 2020 15:45:49 GMT</pubDate><ttl>60</ttl><item><title>Spring @PostConstruct 、@Autowired和Construct 顺序</title><link>http://www.blogjava.net/ZouYonghui/archive/2020/04/09/435331.html</link><dc:creator>Terry Zou</dc:creator><author>Terry Zou</author><pubDate>Thu, 09 Apr 2020 07:29:00 GMT</pubDate><guid>http://www.blogjava.net/ZouYonghui/archive/2020/04/09/435331.html</guid><wfw:comment>http://www.blogjava.net/ZouYonghui/comments/435331.html</wfw:comment><comments>http://www.blogjava.net/ZouYonghui/archive/2020/04/09/435331.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ZouYonghui/comments/commentRss/435331.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ZouYonghui/services/trackbacks/435331.html</trackback:ping><description><![CDATA[<span style="white-space: pre-wrap;"><font color="#cccccc" face="Consolas, Monaco, Andale Mono, Ubuntu Mono, monospace"><span style="background-color: #50556b; color: #ff0000;">@PostConstruct</span></font><font color="#333333" face="pingfang SC, helvetica neue, arial, hiragino sans gb, microsoft yahei ui, microsoft yahei, simsun, sans-serif"><span style="background-color: #ffffff;"><br /></span></font></span><pre class="prism-token token  language-javascript" style="box-sizing: border-box; list-style: inherit; margin-top: 0.5em; margin-bottom: 0.5em; padding: 1em; color: #cccccc; background: #50556b; border-radius: 3px; overflow: auto; font-family: Consolas, Monaco, &quot;Andale Mono&quot;, &quot;Ubuntu Mono&quot;, monospace; overflow-wrap: normal; word-break: normal; line-height: 1.5; tab-size: 4; hyphens: none;">PostConstruct注释用于在完成依赖项注入以执行任何初始化之后需要执行的方法。必须在类投入使用之前调用此方法。
所有支持依赖注入的类都必须支持此注释。即使类没有请求注入任何资源，也必须调用使用PostConstruct注释的方法。
只有一个方法可以使用此批注进行批注。
应用PostConstruct注释的方法必须满足以下所有条件：除了拦截器之外，方法绝不能有任何参数，在这种情况下它采用Interceptor规范定义的InvocationContext对象。
在拦截器类上定义的方法必须具有以下签名之一：
<span class="token keyword" style="box-sizing: border-box; list-style: inherit; color: #cc99cd;">void</span> <span class="token operator" style="box-sizing: border-box; list-style: inherit; color: #67cdcc;">&lt;</span>METHOD<span class="token operator" style="box-sizing: border-box; list-style: inherit; color: #67cdcc;">&gt;</span>（InvocationContext）Object <span class="token operator" style="box-sizing: border-box; list-style: inherit; color: #67cdcc;">&lt;</span>METHOD<span class="token operator" style="box-sizing: border-box; list-style: inherit; color: #67cdcc;">&gt;</span>（InvocationContext）抛出异常注意：
PostConstruct拦截器方法不能抛出应用程序异常，但可以声明它抛出检查异常，包括java<span class="token punctuation" style="box-sizing: border-box; list-style: inherit;">.</span>lang<span class="token punctuation" style="box-sizing: border-box; list-style: inherit;">.</span>Exception，
如果相同的拦截器方法除了生命周期事件之外插入业务或超时方法。
如果PostConstruct拦截器方法返回一个值，容器将忽略它。
在非拦截器类上定义的方法必须具有以下签名：<span class="token keyword" style="box-sizing: border-box; list-style: inherit; color: #cc99cd;">void</span> <span class="token operator" style="box-sizing: border-box; list-style: inherit; color: #67cdcc;">&lt;</span>METHOD<span class="token operator" style="box-sizing: border-box; list-style: inherit; color: #67cdcc;">&gt;</span>（）应用PostConstruct的方法可以是<span class="token keyword" style="box-sizing: border-box; list-style: inherit; color: #cc99cd;">public</span>，<span class="token keyword" style="box-sizing: border-box; list-style: inherit; color: #cc99cd;">protected</span>，<span class="token keyword" style="box-sizing: border-box; list-style: inherit; color: #cc99cd;">package</span> <span class="token keyword" style="box-sizing: border-box; list-style: inherit; color: #cc99cd;">private</span>或<span class="token keyword" style="box-sizing: border-box; list-style: inherit; color: #cc99cd;">private</span>。
除应用程序客户端外，该方法绝不能是静态的。
该方法可能是最终的。如果该方法抛出一个未经检查的异常，那么该类绝不能投入使用，除非EJB可以处理异常甚至从它们恢复的EJB</pre><div><span style="color: #333333; font-family: &quot;pingfang SC&quot;, &quot;helvetica neue&quot;, arial, &quot;hiragino sans gb&quot;, &quot;microsoft yahei ui&quot;, &quot;microsoft yahei&quot;, simsun, sans-serif; white-space: pre-wrap; background-color: #ffffff;"><br />然后就会思考问题，这个注释是修饰初始化之后需要执行的方法，那么它和@Autowired、构造函数的执行顺序是什么呢？（当然注释中已经说明了PostConstruct注释用于在完成依赖项注入之后）<br /></span><div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all;"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->@Service<br /><span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;BeanA&nbsp;{<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;@Autowired<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;BeanB&nbsp;beanB;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;BeanA()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("这是Bean&nbsp;A&nbsp;的构造方法");<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;@PostConstruct<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;init()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("这是BeanA的&nbsp;init&nbsp;方法");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;beanB.testB();<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}</div><div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all;"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->@Service<br /><span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;BeanB&nbsp;{<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;@PostConstruct<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;init()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("这是BeanB&nbsp;的init&nbsp;方法");<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;BeanB()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("这是Bean&nbsp;B的&nbsp;构造方法");<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;testB()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("这是Bean&nbsp;B&nbsp;的&nbsp;testB&nbsp;方法");<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}</div><br />启动后输出:<br /><pre token=""  language-javascript"="" style="box-sizing: border-box; list-style: inherit; margin-top: 0.5em; margin-bottom: 0.5em; padding: 1em; color: #cccccc; background: #50556b; border-radius: 3px; overflow: auto; font-family: Consolas, Monaco, &quot;Andale Mono&quot;, &quot;Ubuntu Mono&quot;, monospace; overflow-wrap: normal; word-break: normal; line-height: 1.5; tab-size: 4; hyphens: none;">这是Bean A 的构造方法 <br />这是Bean B的 构造方法 <br />这是BeanB 的init 方法 <br />这是BeanA的 init 方法 <br />这是Bean B 的 testB 方法<br /><br />所以得到结论： 构造方法 &gt;&nbsp;@Autowired &gt;&nbsp;@PostConstruct</pre></div><img src ="http://www.blogjava.net/ZouYonghui/aggbug/435331.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ZouYonghui/" target="_blank">Terry Zou</a> 2020-04-09 15:29 <a href="http://www.blogjava.net/ZouYonghui/archive/2020/04/09/435331.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Spring中的ApplicationListener的使用详解案例（观察者模式)</title><link>http://www.blogjava.net/ZouYonghui/archive/2020/04/09/435329.html</link><dc:creator>Terry Zou</dc:creator><author>Terry Zou</author><pubDate>Thu, 09 Apr 2020 06:47:00 GMT</pubDate><guid>http://www.blogjava.net/ZouYonghui/archive/2020/04/09/435329.html</guid><wfw:comment>http://www.blogjava.net/ZouYonghui/comments/435329.html</wfw:comment><comments>http://www.blogjava.net/ZouYonghui/archive/2020/04/09/435329.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ZouYonghui/comments/commentRss/435329.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ZouYonghui/services/trackbacks/435329.html</trackback:ping><description><![CDATA[<div>1、ApplicationContext</div><div>Spring的核心，Context我们通常解释为上下文环境。ApplicationContext则是应用的容器。 Spring把Bean（object）放在容器中，需要用就通过get方法取出来。在ApplicationContext接口的众多实现类中，有3个是我们经常用到的（见表1-1），并且使用这3个实现类也基本能满足我们Java EE应用开发中的绝大部分需求。</div><div><span style="color: #4d4d4d; font-family: &quot;Microsoft YaHei&quot;, &quot;SF Pro Display&quot;, Roboto, Noto, Arial, &quot;PingFang SC&quot;, sans-serif; font-size: 16px; background-color: #ffffff;">表1-1 ApplicationContext接口的常用实现类介绍<br /></span><fieldset><legend><span style="color: #4f4f4f; font-family: &quot;Microsoft YaHei&quot;, &quot;SF Pro Display&quot;, Roboto, Noto, Arial, &quot;PingFang SC&quot;, sans-serif; background-color: #f7f7f7;">ClassPathXmlApplicationContext</span></legend><div>从类路径ClassPath中寻找指定的XML配置文件，找到并装载完成ApplicationContext的实例化工作。例如： //装载单个配置文件实例化ApplicationContext容器</div><div>ApplicationContext cxt = new ClassPathXmlApplicationContext("applicationContext.xml");</div><div>//装载多个配置文件实例化ApplicationContext容器</div><div>String[] configs = {"bean1.xml","bean2.xml","bean3.xml"};</div><div>ApplicationContext cxt = new ClassPathXmlApplicationContext(configs);</div></fieldset><fieldset><legend><span style="color: #4f4f4f; font-family: &quot;Microsoft YaHei&quot;, &quot;SF Pro Display&quot;, Roboto, Noto, Arial, &quot;PingFang SC&quot;, sans-serif; background-color: #ffffff;">FileSystemXmlApplicationContext</span></legend><div>从指定的文件系统路径中寻找指定的XML配置文件，找到并装载完成ApplicationContext的实例化工作。例如：//装载单个配置文件实例化ApplicationContext容器</div><div>ApplicationContext cxt = new FileSystemXMLApplicationContext("beans.xml");</div><div>//装载多个配置文件实例化ApplicationContext容器</div><div>String[] configs = {"c:/beans1.xml","c:/beans2.xml"};</div><div>ApplicationContext cxt = new FileSystemXmlApplicationContext(configs);</div></fieldset><fieldset><legend><span style="color: #4f4f4f; font-family: &quot;Microsoft YaHei&quot;, &quot;SF Pro Display&quot;, Roboto, Noto, Arial, &quot;PingFang SC&quot;, sans-serif; background-color: #f7f7f7;">XmlWebApplicationContext</span></legend><div>从Web应用中寻找指定的XML配置文件，找到并装载完成ApplicationContext的实例化工作。这是为Web工程量身定制的，使用WebApplicationContextUtils类的getRequiredWebApplicationContext方法可在JSP与Servlet中取得IoC容器的引用</div></fieldset><span style="color: #4d4d4d; font-family: &quot;Microsoft YaHei&quot;, &quot;SF Pro Display&quot;, Roboto, Noto, Arial, &quot;PingFang SC&quot;, sans-serif; font-size: 16px; background-color: #ffffff;">2、ApplicationEvent<br /></span><span style="color: #4d4d4d; font-family: &quot;Microsoft YaHei&quot;, &quot;SF Pro Display&quot;, Roboto, Noto, Arial, &quot;PingFang SC&quot;, sans-serif; font-size: 16px; background-color: #ffffff;">是个抽象类，里面只有一个构造函数和一个长整型的timestamp。其源码如下<br /></span><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><br /><span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">abstract</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;ApplicationEvent&nbsp;<span style="color: #0000FF; ">extends</span>&nbsp;EventObject&nbsp;{<br />&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">/**</span><span style="color: #008000; ">&nbsp;use&nbsp;serialVersionUID&nbsp;from&nbsp;Spring&nbsp;1.2&nbsp;for&nbsp;interoperability&nbsp;</span><span style="color: #008000; ">*/</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;<span style="color: #0000FF; ">final</span>&nbsp;<span style="color: #0000FF; ">long</span>&nbsp;serialVersionUID&nbsp;=&nbsp;7099057708183571937L;<br />&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">/**</span><span style="color: #008000; ">&nbsp;System&nbsp;time&nbsp;when&nbsp;the&nbsp;event&nbsp;happened&nbsp;</span><span style="color: #008000; ">*/</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;<span style="color: #0000FF; ">final</span>&nbsp;<span style="color: #0000FF; ">long</span>&nbsp;timestamp;<br />&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">/**</span><span style="color: #008000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Create&nbsp;a&nbsp;new&nbsp;ApplicationEvent.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080; ">@param</span><span style="color: #008000; ">&nbsp;source&nbsp;the&nbsp;object&nbsp;on&nbsp;which&nbsp;the&nbsp;event&nbsp;initially&nbsp;occurred&nbsp;(never&nbsp;{</span><span style="color: #808080; ">@code</span><span style="color: #008000; ">&nbsp;null})<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">*/</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;ApplicationEvent(Object&nbsp;source)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">super</span>(source);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">this</span>.timestamp&nbsp;=&nbsp;System.currentTimeMillis();<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">/**</span><span style="color: #008000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Return&nbsp;the&nbsp;system&nbsp;time&nbsp;in&nbsp;milliseconds&nbsp;when&nbsp;the&nbsp;event&nbsp;happened.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">*/</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">final</span>&nbsp;<span style="color: #0000FF; ">long</span>&nbsp;getTimestamp()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;<span style="color: #0000FF; ">this</span>.timestamp;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}</div><span style="color: #4d4d4d; font-family: &quot;Microsoft YaHei&quot;, &quot;SF Pro Display&quot;, Roboto, Noto, Arial, &quot;PingFang SC&quot;, sans-serif; font-size: 16px; background-color: #ffffff;"><br />3、ApplicationListener</span><br /><div><span style="font-size: 16px;">是一个接口，里面只有一个onApplicationEvent方法。如果在上下文中部署一个实现了ApplicationListener接口的bean,那么每当在一个ApplicationEvent发布到 ApplicationContext时，调用ApplicationContext.publishEvent()方法，这个bean得到通知。类似于Oberver设计模式。</span></div><div><span style="color: #4d4d4d; font-family: &quot;Microsoft YaHei&quot;, &quot;SF Pro Display&quot;, Roboto, Noto, Arial, &quot;PingFang SC&quot;, sans-serif; font-size: 16px; background-color: #ffffff;">其源码如下：</span></div><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><br /><span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">interface</span>&nbsp;ApplicationListener&lt;E&nbsp;<span style="color: #0000FF; ">extends</span>&nbsp;ApplicationEvent&gt;&nbsp;<span style="color: #0000FF; ">extends</span>&nbsp;EventListener&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">/**</span><span style="color: #008000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Handle&nbsp;an&nbsp;application&nbsp;event.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080; ">@param</span><span style="color: #008000; ">&nbsp;event&nbsp;the&nbsp;event&nbsp;to&nbsp;respond&nbsp;to<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">*/</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;onApplicationEvent(E&nbsp;event);<br />&nbsp;<br />}</div>下面举个例子<br />自定义事件NotifyEvent:<br /><div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all;"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">import</span>&nbsp;org.springframework.context.ApplicationEvent;<br /><br /><span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;NotifyEvent&nbsp;&nbsp;<span style="color: #0000FF; ">extends</span>&nbsp;ApplicationEvent&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;String&nbsp;email;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;String&nbsp;content;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;NotifyEvent(Object&nbsp;source){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">super</span>(source);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;NotifyEvent(Object&nbsp;source,String&nbsp;email,String&nbsp;content){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">super</span>(source);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">this</span>.email&nbsp;=&nbsp;email;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">this</span>.content&nbsp;=&nbsp;content;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;String&nbsp;getEmail()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;email;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;setEmail(String&nbsp;email)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">this</span>.email&nbsp;=&nbsp;email;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;String&nbsp;getContent()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;content;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;setContent(String&nbsp;content)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">this</span>.content&nbsp;=&nbsp;content;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}</div><br /><span style="color: #212529; font-family: -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, Arial, &quot;Noto Sans&quot;, sans-serif, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Noto Color Emoji&quot;; font-size: 16px; background-color: #ffffff;">定义监听器NotifyListener:<br /></span><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">import</span>&nbsp;org.springframework.context.ApplicationListener;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.springframework.context.annotation.Configuration;<br /><br />@Configuration<br /><span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;NotifyListener&nbsp;<span style="color: #0000FF; ">implements</span>&nbsp;ApplicationListener&lt;NotifyEvent&gt;{<br />&nbsp;&nbsp;&nbsp;&nbsp;@Override<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;onApplicationEvent(NotifyEvent&nbsp;event)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("邮件地址："&nbsp;+&nbsp;event.getEmail());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("邮件内容："&nbsp;+&nbsp;event.getContent());<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}</div><span style="color: #212529; font-family: -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, Arial, &quot;Noto Sans&quot;, sans-serif, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Noto Color Emoji&quot;; font-size: 16px; background-color: #ffffff;"><br /></span><span style="color: #212529; font-family: -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, Arial, &quot;Noto Sans&quot;, sans-serif, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Noto Color Emoji&quot;; font-size: 16px; background-color: #ffffff;">单元测试类ListenerTest：</span></div><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">import</span>&nbsp;org.junit.Test;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.junit.runner.RunWith;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.springframework.beans.factory.annotation.Autowired;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.springframework.boot.test.context.SpringBootTest;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.springframework.test.context.junit4.SpringRunner;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.springframework.web.context.WebApplicationContext;<br /><br />@RunWith(SpringRunner.<span style="color: #0000FF; ">class</span>)<br />@SpringBootTest(classes&nbsp;=&nbsp;ServerLauncher.<span style="color: #0000FF; ">class</span>,&nbsp;webEnvironment&nbsp;=&nbsp;SpringBootTest.WebEnvironment.RANDOM_PORT)<br /><span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;ListenerTest&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;@Autowired<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;WebApplicationContext&nbsp;webApplicationContext;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;@Test<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;testListener(){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NotifyEvent&nbsp;event&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;NotifyEvent("object","abc@qq.com","This&nbsp;is&nbsp;the&nbsp;content");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;webApplicationContext.publishEvent(event);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}</div><img src ="http://www.blogjava.net/ZouYonghui/aggbug/435329.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ZouYonghui/" target="_blank">Terry Zou</a> 2020-04-09 14:47 <a href="http://www.blogjava.net/ZouYonghui/archive/2020/04/09/435329.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>