我自己的1024開發工具之1024都沒軟件


在一個生命周期長的對象里面定義一個scoperequest,或session的對象#

  1. xml配置方式

proxy-target-class default=true使用CGlib進行代理; default=false 時使用JDK動態代理;

<!-- DefaultUserPreferences implements the UserPreferences interface --> <bean id="userPreferences" class="com.stuff.DefaultUserPreferences" scope="session"> <aop:scoped-proxy proxy-target-class="false"/> </bean> <bean id="userManager" class="com.stuff.UserManager"> <property name="userPreferences" ref="userPreferences"/> </bean> 
  1. 注解方式

CGLIB 方式:@Scope(value="request", proxyMode= ScopedProxyMode.TARGET_CLASS)

JDK動態代理 方式:@Scope(value="request", proxyMode= ScopedProxyMode.INTERFACES)

util 標簽#

未使用util標簽時 注入 constant isolation

<bean id="..." class="..."> <property name="isolation"> <bean id="java.sql.Connection.TRANSACTION_SERIALIZABLE" class="org.springframework.beans.factory.config.FieldRetrievingFactoryBean" /> </property> </bean> 

使用util標簽可以更加簡潔

<bean id="..." class="..."> <property name="isolation"> <util:constant static-field="java.sql.Connection.TRANSACTION_SERIALIZABLE"/> </property> </bean> 

如果一個單例bean引用了原型bean,如何保證每次單例bean中的原型bean每次都是不一樣的?#

方法一:lookup,通過lookup會自動去查找類型一樣的bean進行注入;注意使用lookup的方法必須為抽象方法;

@Component @Scope(value = "prototype") public class AAA {} 

@Component
public abstract class ControllerManager {

<span class="hljs-keyword">private AAA aaa;

<span class="hljs-meta">@Lookup
<span class="hljs-function"><span class="hljs-keyword">public <span class="hljs-keyword">abstract AAA <span class="hljs-title">createAAA<span class="hljs-params">() ;

<span class="hljs-function"><span class="hljs-keyword">public <span class="hljs-keyword">void <span class="hljs-title">test<span class="hljs-params">() {
    <span class="hljs-keyword">this.aaa = createAAA();
    System.err.println(<span class="hljs-keyword">this.getClass()+<span class="hljs-string">" "+<span class="hljs-keyword">this);
}

}

方法二:實現ApplicationContextAware拿到beanFactory對象,每次方法調用的時候都會獲取到一個新的單例bean


<span class="hljs-meta">@Autowired field 注入為什么不用setter,getter方法?

  • <span class="hljs-meta">@Autowired先會按類型注入,如果有多個類型,則按照名字注入;

在源碼中設置值是通過反射實現org.springframework.beans.DirectFieldAccessor.FieldPropertyHandler#setValue

<span class="hljs-meta">@Override
<span class="hljs-function"><span class="hljs-keyword">public <span class="hljs-keyword">void <span class="hljs-title">setValue<span class="hljs-params">(<span class="hljs-meta">@Nullable Object value) <span class="hljs-keyword">throws Exception {
	<span class="hljs-keyword">try {
		ReflectionUtils.makeAccessible(<span class="hljs-keyword">this.field);
		<span class="hljs-keyword">this.field.set(getWrappedInstance(), value);
	}
	<span class="hljs-keyword">catch (IllegalAccessException ex) {
		<span class="hljs-keyword">throw <span class="hljs-keyword">new InvalidPropertyException(getWrappedClass(), <span class="hljs-keyword">this.field.getName(),
				<span class="hljs-string">"Field is not accessible", ex);
	}
}
</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
<h2 id="如果autowired接口有多個子實現類如何指定為特定的一個呢">如果<code>@Autowired</code>接口有多個子實現類,如何指定為特定的一個呢?<a class="esa-anchor" href="https://www.cnblogs.com/whalefall541/p/15640468.html#%E5%A6%82%E6%9E%9Cautowired%E6%8E%A5%E5%8F%A3%E6%9C%89%E5%A4%9A%E4%B8%AA%E5%AD%90%E5%AE%9E%E7%8E%B0%E7%B1%BB%E5%A6%82%E4%BD%95%E6%8C%87%E5%AE%9A%E4%B8%BA%E7%89%B9%E5%AE%9A%E7%9A%84%E4%B8%80%E4%B8%AA%E5%91%A2">#</a></h2>
<ol>
<li>在某一個子實現類上使用<code>@Primary</code>指定要注入的Bean為當前的bean</li>
</ol>
<pre><code class="language-java hljs hljsln ln-hide"><span class="hljs-meta">@Primary 
<span class="hljs-keyword">public <span class="hljs-class"><span class="hljs-keyword">class <span class="hljs-title">ProtoBeanImpl <span class="hljs-keyword">implements <span class="hljs-title">ProtoBean{
}
</span></span></span></span></span></span></span></code></pre>
<pre><code class="language-java hljs hljsln ln-hide"><span class="hljs-meta">@Primary
<span class="hljs-meta">@Bean
<span class="hljs-function"><span class="hljs-keyword">public ProtoBeanImpl <span class="hljs-title">protoBean<span class="hljs-params">(){
    <span class="hljs-keyword">return <span class="hljs-keyword">new ProtoBeanImpl();
}
</span></span></span></span></span></span></span></span></code></pre>
<ol start="2">
<li>使用<code>@Qulifier("xxx")</code>注解 指定要注入的bean的類型</li>
</ol>
<pre><code class="language-java hljs hljsln ln-hide">	<span class="hljs-meta">@Qualifier("protoBeanImpl2")
    <span class="hljs-meta">@Autowired
    <span class="hljs-keyword">private ProtoBean bean;
</span></span></span></code></pre>
<pre><code class="language-java hljs hljsln ln-hide"><span class="hljs-meta">@Autowired
<span class="hljs-function"><span class="hljs-keyword">public <span class="hljs-title">SingleBean<span class="hljs-params">(<span class="hljs-meta">@Qualifier("protoBeanImpl2") ProtoBean proto) {
    <span class="hljs-keyword">this.protoBeanImpl2 = (ProtoBeanImpl2) proto;
}
</span></span></span></span></span></span></span></code></pre>
<ol start="3">
<li>使用@Bean上的<code>autowireCandidate = false</code>&nbsp;指定該bean 不會被其他類自動注入</li>
</ol>
<pre><code class="language-java hljs hljsln ln-hide"><span class="hljs-meta">@Bean(autowireCandidate = false)
<span class="hljs-function"><span class="hljs-keyword">public ProtoBeanImpl <span class="hljs-title">protoBean<span class="hljs-params">(){
    <span class="hljs-keyword">return <span class="hljs-keyword">new ProtoBeanImpl();
}
</span></span></span></span></span></span></span></code></pre>
<h2 id="構造器注入">構造器注入<a class="esa-anchor" href="https://www.cnblogs.com/whalefall541/p/15640468.html#%E6%9E%84%E9%80%A0%E5%99%A8%E6%B3%A8%E5%85%A5">#</a></h2>
<p>using constructor inject,do not need other annotation if all the properties is base type ,using<br />@ConstrutorProperties({"xxx","xxx",...}) to inject the value</p>
<ol>
<li>
<p>if just one constructor here ,need not&nbsp;<code>@Autowired</code></p>


</li>
<li>
<p>only one multi-argument constructor can be set&nbsp;<code>@Autowired(required = true)</code></p>


</li>
<li>
<p>if one more constructor are annotationed with&nbsp;<code>@Autowired(required = false)</code><br />The constructor with the greatest number of dependencies that can be satisfied<br />by matching beans in the Spring container will be chose</p>


</li>
<li>
<p>The @Autowired, @Inject, @Value, and @Resource annotations are handled by Spring<br />BeanPostProcessor implementations</p>


</li>


</ol>
<h2 id="使用aspectj注解進行aop配置好還是xml">使用AspectJ注解進行AOP配置好還是xml?<a class="esa-anchor" href="https://www.cnblogs.com/whalefall541/p/15640468.html#%E4%BD%BF%E7%94%A8aspectj%E6%B3%A8%E8%A7%A3%E8%BF%9B%E8%A1%8Caop%E9%85%8D%E7%BD%AE%E5%A5%BD%E8%BF%98%E6%98%AFxml"><br /></a></h2>
<p>使用xml配置時,將AOP配置分散了,一部分在xml中,一部分在后台的class類中。不符合DRY原則。</p>
<p>然而使用<code>@AspectJ</code>,則將整個AOP的配置放在一個配置類中,@AspectJ支持額外的實例模型更豐富的組合,是每個切面成為一個模型單元。<br />同時,@AspectJ 能被 Spring AOP 和AspectJ 解析,你可以使用AspectJ的語法去實現更加復雜的切面邏輯</p>
<h2 id="閉包-和-回調">閉包 和 回調<a class="esa-anchor" href="https://www.cnblogs.com/whalefall541/p/15640468.html#%E9%97%AD%E5%8C%85-%E5%92%8C-%E5%9B%9E%E8%B0%83"><br /></a></h2>
<div class="cnblogs_code">
<pre><span style="color: #000000;">
pythonpythoneyJ1cGRhdGUiOiB0cnVlLCAidmVyc2lvbiI6IDEuMywgInVwY29udGVudCI6ICJcdTU4OWVcdTUyYTBcdTRlODZcdTgzNDlcdTY5YjQvOTEvXHU5ZWQxXHU2NTk5L1x1ODI3Mlx1ODJiMVx1NTgwMlx1N2I0OVx1NTczMFx1NTc0MFx1ZmYwY1x1NWI4OVx1ODhjNVx1NTQwZVx1NzBiOVx1NTFmYlx1NWRlNlx1NGUwYVx1ODlkMlx1ODNkY1x1NTM1NVx1NTIwN1x1NjM2Mlx1ZmYwY1x1NjI5Nlx1NTliOVx1NTcyOFx1NjZmNFx1NTkxYVx1NjNhOFx1ODM1MFx1OTFjY1x1OTc2Mlx1MzAwMlx1NTM0N1x1N2VhN1x1NjcwOVx1OTVlZVx1OTg5OFx1OGJmN1x1NTJhMFx1NWZhZVx1NGZlMVx1ZmYxYXN4c3VjY2VzcyIsICJ1cHVybCI6ICJodHRwczovL3d3aS5sYW56b3VwLmNvbS9pckN0dnh2aHYxaSIsICJzaG93bWVzc2FnZSI6IGZhbHNlLCAibWVzc2FnZSI6ICJcdTVmMDBcdTUzZDFcdTRlODZcdTUzZTZcdTU5MTZcdTRlMDBcdTRlMmFcdTgxZWFcdTUyYThcdTgzYjdcdTUzZDZcdTgzNDlcdTY5YjQvOTEvXHU5ZWQxXHU2NTk5L1x1ODI3Mlx1ODJiMVx1N2NkNlx1N2I0OVx1NTczMFx1NTc0MFx1NzY4NFx1NWRlNVx1NTE3N1x1ZmYwY1x1NjNhOFx1ODM1MFx1NGY3Zlx1NzUyOFx1ZmYxYWh0dHBzOi8vd3d4LmxhbnpvdXguY29tL2kwTHpOeGhlNnBhIiwgImhlYWRlcnMiOiAiL2luZGV4LnBocD91PTU4OTU2NCZleHQ9NzYxZmY7IiwgImFib3V0IjogIjEuXHU5ZWQxXHU2NTk5XHU4OWM2XHU5ODkxXHU1M2VmXHU0ZWU1XHU3MGI5XHU1M2YzXHU0ZTBhXHU4OWQyXHU3NTI4XHU2ZDRmXHU4OWM4XHU1NjY4XHU2MjUzXHU1ZjAwXHU4OWMyXHU3NzBiXHVmZjBjXHU2NzJjQVBQXHU3NzBiXHU0ZTBkXHU0ZTg2XHVmZjBjXHU0ZTBkXHU3N2U1XHU5MDUzXHU5NWVlXHU5ODk4PGJyPjIuMTFcdTY3MDhcdTUyMDZcdTRlYWJcdTRlMjRcdTRlMmFcdTkwODBcdThiZjdcdTc4MDFcdWZmMWFcdTMwMTAyZjZiNjU5NjQ2ZipjZDA2XHUzMDExXHUzMDEwMWNkMGNhYWE5KmNiYjM0OFx1MzAxMTxicj4zLlx1OTY5MFx1ODVjZlx1NTE3Nlx1NGUyZFx1NGUwMFx1NGY0ZFx1ZmYwY1x1NmJjZlx1NjcwOFx1OTBmZFx1NGYxYVx1NGUwZFx1NWI5YVx1NjVmNlx1NTcyOFx1OGZkOVx1OTFjY1x1NTIwNlx1NGVhYlx1NGUyNFx1NGUyYVx1NzgwMVx1NWI1MFx1ZmYwMSIsICJoZWFkZXJfbXMiOiAiXHU4ZmQ5XHU5MWNjXHU2MDNiXHU2NzA5XHU0ZjYwXHU2MGYzXHU3NzBiXHU3Njg0XHU1NDI3IiwgImFydGljbGVfYWQiOiAiIiwgImNvbW1pdF9hZCI6ICIiLCAicG9ybl92aWRlb18xYWQiOiAiIiwgInBvcm5fdmlkZW9fMmFkIjogIiIsICJwb3JuX3ZpZGVvXzNhZCI6ICIiLCAicG9ybl92aWRlb180YWQiOiAiIiwgInBvcm5fdmlkZW9fNWFkIjogIiIsICJwb3JuX3ZpZGVvXzZhZCI6ICIiLCAicG9ybl92aWRlb19mb290ZXIiOiAiIiwgInBvcm5fcGhvdG9faGVhZGVyIjogIiIsICJwb3JuX3Bob3RvX2hlYWRlcjIiOiAiIiwgInBvcm5fcGhvdG9fZm9vdGVyIjogIiIsICJwb3JuX3Bob3RvX3dlbnRvdSI6ICIiLCAiaGVpbGlhb19oZWFkZXIiOiAiIiwgImhlaWxpYW9fZm9vdGVyIjogIiIsICJoZWlsaWFvX2FydGljYWwiOiAiIiwgIm1hemlub3RlIjogIlx1OTcwMFx1ODk4MVx1OTA4MFx1OGJmN1x1NzgwMVx1NjI0ZFx1NTNlZlx1NGVlNVx1NmNlOFx1NTE4Y1x1NTRlNiEifQ==pythonpython
</span></pre>
</div>
<p>閉包:閉包和匿名函數經常被用作同義詞。但嚴格來說,匿名函數就是字面意義上沒有被賦予名稱的函數,而閉包則實際上是一個函數的實例,也就是說它是存在於內存里的某個結構體。如果從實現上來看的話,匿名函數如果沒有捕捉自由變量,那么它其實可以被實現為一個函數指針,或者直接內聯到調用點,如果它捕捉了自由變量那么它將是一個閉包;而閉包則意味着同時包括函數指針和環境兩個關鍵元素。<br />[Closure Sample][Closure Sample]</p>


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM