Netty傻瓜教程(九):懂點Spring

咱們的代碼中,常常出現A類調用B類和D類,B類調用C類,D類也調用C類,這叫作依賴,而咱們後期開發中會變更這些依賴,好比D類的實現對C類有所改進,可是B類卻不須要使用改進的D類,這時候通常方法只能在D類中把對C類的調用改掉。能夠想象,依賴一旦多了以後,修改起來就比較麻煩了。這時候引入Spring框架,它就是用來管理類的。最好建立一個Maven項目,這樣只要在pom.xml文件裏引入:java

<!-- Spring Core -->
        <!-- http://mvnrepository.com/artifact/org.springframework/spring-core -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
            <version>4.1.4.RELEASE</version>
        </dependency>
         
        <!-- Spring Context -->
        <!-- http://mvnrepository.com/artifact/org.springframework/spring-context -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>4.1.4.RELEASE</version>
        </dependency>

1. 不要覺得這裏的版本號無所謂,引入其它的版本號,可能會有莫名其妙的錯誤。spring

若是不知道什麼叫Maven,那麼請自行搜索學習。框架

在開發前,我先將一個故事,張3、李四去山上砍柴,張三喜歡用石頭作的斧子,李四喜歡用鐵作的斧子。很顯然,張三和李四的共同點是二者都是人,咱們最好定義一我的的接口,否則哪天王二麻子來了,又要從新寫個類多麻煩。一樣,也要定義一個斧子的接口,萬一哪天換成電鋸了呢。學習

人的接口:測試

package com.hengzecn.Spring;

public interface Person {
	public void useAxe();
}

斧子的接口,在接口裏面定義了砍這個方法:this

package com.hengzecn.Spring;

public interface Axe {
	public String kan();
}

張三來了:netty

package com.hengzecn.Spring;

public class ZhangSan implements Person {
	public Axe axe;
	public void setAxe(Axe axe){
		this.axe = axe;
	}

	public void useAxe() {
		// TODO Auto-generated method stub
		System.out.println(axe.kan());
	}

}

1 張三雖然喜歡用石頭斧子,可是他萬一想換換斧子呢,咱們從後面能夠看到,張三果真想換斧子。code

李四來了:component

package com.hengzecn.Spring;

public class LiSi implements Person {
	public Axe axe;
	public void setAxe(Axe axe){
		this.axe = axe;
	}

	public void useAxe() {
		// TODO Auto-generated method stub
		System.out.println(axe.kan());
	}

}

如今實現石頭斧子:xml

package com.hengzecn.Spring;

public class StoneAxe implements Axe {

	public String kan() {
		// TODO Auto-generated method stub
		return "石頭斧子";
	}

}

鐵斧子:

package com.hengzecn.Spring;

public class IronAxe implements Axe {

	public String kan() {
		// TODO Auto-generated method stub
		return "鐵斧子";
	}

}

Spring須要一個配置文件,通常放在src文件夾下:

<?xml version="1.0" encoding="UTF-8"?>
<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">
  
    <bean id="zhangSan" class="com.hengzecn.spring.ZhangSan">
 	<property name="axe" ref="stoneAxe" />
 </bean>
 
  <bean id="liSi" class="com.hengzecn.spring.LiSi">
 	<property name="axe" ref="ironAxe" />
 </bean>
 
 <bean id="stoneAxe" class="com.hengzecn.spring.StoneAxe" />
 <bean id="ironAxe" class="com.hengzecn.spring.IronAxe" />
  
</beans>

1. 要注意大小寫,通常包名用小寫

寫個程序測試下:

package com.hengzecn.spring;

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

public class SpringTest {
	public static void main(String[] args) throws Exception{
		ApplicationContext ctx = new ClassPathXmlApplicationContext("beans.xml");
		Person p = (Person) ctx.getBean("liSi");
		p.useAxe();
	}
}

結果以下圖:

回過頭來看什麼叫注入,個人理解就是幫你初始化對象,注入強調的是一個動態過程,也就是寫程序的時候不用初始化,運行的時候根據配置文件進行初始化。

若是嫌配置xml煩的話,也能夠用Spring的註解,使用註解的時候要注意,配置文件和必定要加上命名空間:

<?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:context = "http://www.springframework.org/schema/context"
    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-4.0.xsd">
  <!-- 該 BeanPostProcessor 將自動對標註 @Autowired 的 Bean 進行注入 -->
  <context:component-scan
  		base-package = "com.hengzecn.Spring"/>     
  <bean class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor"/> 
  
    <bean id="zhangSan" class="com.hengzecn.Spring.ZhangSan">
 	
 </bean>
 
  <bean id="liSi" class="com.hengzecn.Spring.LiSi">
 	
 </bean>
 
 <bean id="stoneAxe" class="com.hengzecn.Spring.StoneAxe" />
 <bean id="ironAxe" class="com.hengzecn.Spring.IronAxe" />
  
</beans>

1. 不要忘了xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"和http://www.springframework.org/schema/context
                        http://www.springframework.org/schema/context/spring-context-4.0.xsd

2. 自動標註<context:component-scan
          base-package = "com.hengzecn.Spring"/>

咱們在張三的實現類中:

package com.hengzecn.Spring;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;



public class ZhangSan implements Person {
	@Autowired  
	@Qualifier(value = "stoneAxe")
	private Axe axe;
	public void setAxe(Axe axe){
		this.axe = axe;
	}
	

	public void useAxe() {
		// TODO Auto-generated method stub
		System.out.println(axe.kan());
	}

}

1. @Autowired是自動注入,由於有兩個Axe類型的bean,因此用@Qualifier區別一下,是使用id爲stoneAxe的bean來注入

@Resource可以起到上述一樣的效果:

package com.hengzecn.Spring;

import javax.annotation.Resource;



public class ZhangSan implements Person {
	@Resource(name="stoneAxe")
	private Axe axe;
	public void setAxe(Axe axe){
		this.axe = axe;
	}
	

	public void useAxe() {
		// TODO Auto-generated method stub
		System.out.println(axe.kan());
	}

}

1. @Resource註解是javax.annotation.Resource包裏面的,注意下運行環境,我用的是JRE 1.8,過小的版本沒有這個註解。

從配置文件能夠看出,在引入註解以後,配置文件中省略掉了<property></property>

Spring就談到這裏,其它註解不是很難,想了解的,或者想深刻了解的,自行搜索學習。

雖然這一部分沒有談netty,可是Spring是一個基礎,咱們能夠用Spring來管理netty程序。

相關文章
相關標籤/搜索