Tuesday, January 3, 2017

Spring简介 -- 基本结构和注解

基本Spring含有beans.xml配置文件以及Main.java(任意含main的java文件)启动
在com/resources/com/vtasters/beans.xml。用到spring-context包。

最简单的例子

beans.xml:
<?xml version="1.0" encoding="UTF-8"?>
     <beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
<bean id="video" class="com.vtasters.Video">
      </bean>
    </beans>

Main.java:
public class Main {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("com/vtasters/beans.xml");
Video t = (Video) context.getBean("video");
   }      
}


注解:

Spring引入Java依赖注入标准后,使得beans.xml更简洁。Spring会扫描包里面的每个类,@Named就是注册bean,省去beans.xml的定义。

beans.xml加入注解和扫描包:
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-2.5.xsd"

<context:component-scan base-package="com.vtasters" />

@Inject会自动注入实例,不用再手动产生,立刻可以使用(虽然为空)。

public class Video {
@Inject
private Customer customer;
}

@Named
public class Customer {}


ref:
Spring helloworld项目
如何加入beans.xml
注解扫描

其他讲解:

Spring主要用于Dependency Injection,它将实例的创建独立出来XML或config class。所以如果java代码没有contructor定义(特别时带参数的),就要到Beans.xml中找。

下面重点解释Beans.xml中每个设置:

id

是整个服务的唯一标示(用户定义)

Scope:

用于定义实例是否单例模式。值为singleton或prototype(每次产生新实例)

HelloWorld.java:
public class HelloWorld {
   private String message;

   public void setMessage(String message){
      this.message  = message;
   }

   public void getMessage(){
      System.out.println("Your Message : " + message);
   }
}

Beans.xml:
  <bean id="helloWorld" class="com.tutorialspoint.HelloWorld" scope="singleton"/>

Main.xml:
 HelloWorld objA = (HelloWorld) context.getBean("helloWorld");
 objA.setMessage("I'm object A");
 objA.getMessage();
 HelloWorld objB = (HelloWorld) context.getBean("helloWorld");
 objB.getMessage();

每次返回一个结果。

constructor-arg:

public class Foo {
   public Foo(Bar bar, Baz baz) {}
}

 <bean id="foo" class="com.example.Foo">
      <constructor-arg ref="bar"/>
      <constructor-arg ref="baz"/>
   </bean>
   <bean id="bar" class="com.example.Bar"/>
   <bean id="baz" class="com.example.Baz"/>
这是自定义class。如果constructor是primitive类型:
   <bean id="exampleBean" class="examples.ExampleBean">
      <constructor-arg type="int" value="2001"/>
      <constructor-arg type="java.lang.String" value="Zara"/>
   </bean>

property:

用于指定类变量及其初值
   <bean id="helloWorld" class="com.tutorialspoint.HelloWorld">
      <property name="message" value="Hello World!"/>
   </bean>

parent/abstract:

   <bean id="helloWorld" class="com.tutorialspoint.HelloWorld"/>
   <bean id="helloIndia" class="com.tutorialspoint.HelloIndia" parent="helloWorld"/>
如果父类是抽象类,加入abstract即可
   <bean id="beanTeamplate" abstract="true"/>

inner bean:

public class TextEditor {
   private SpellChecker spellChecker;
}

 <bean id="textEditor" class="com.tutorialspoint.TextEditor">
      <property name="spellChecker">
         <bean id="spellChecker" class="com.tutorialspoint.SpellChecker"/>
       </property>
   </bean>

Collection Injection:

     <property name="addressList">
         <list>
            <value>INDIA</value>
            <value>Pakistan</value>
            <value>USA</value>
            <value>USA</value>
         </list>
      </property>


Annotation Based Configuration

上述是以xml为基础的config,下面介绍以Annotation为基础,更为简洁和易读。

@Autowired在setter:

public class TextEditor {
   private SpellChecker spellChecker;

   @Autowired
   public void setSpellChecker( SpellChecker spellChecker ){
      this.spellChecker = spellChecker;
   }
   public SpellChecker getSpellChecker( ) {
      return spellChecker;
   }
   public void spellCheck() {
      spellChecker.checkSpelling();
   }
}

   <!-- 这里就不需要constructor-arg  -->
   <bean id="textEditor" class="com.tutorialspoint.TextEditor">
   </bean>


@Autowired在constructor:
  @Autowired
   public TextEditor(SpellChecker spellChecker){
      System.out.println("Inside TextEditor constructor." );
      this.spellChecker = spellChecker;
   }

   <!-- 这里就不需要constructor-arg  -->
 <bean id="textEditor" class="com.tutorialspoint.TextEditor">
 </bean>


@Autowired在property:

   这样就不需要setter了
  @Autowired

   private SpellChecker spellChecker;

No comments:

Post a Comment