1. 程式人生 > >三、Spring註解開發

三、Spring註解開發

1.入門

  • 新建web專案,匯入spring相關jar包,並新增核心配置檔案applicationContext.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"
       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.xsd">
<!--配置元件掃描--> <context:
component-scan
base-package="com.itlike.demo1"/>
</beans>

2.第一個Demo

  • User
@Component("user")  //相當於bean id=""
public class User {
    public String name;
}
  • applicationContext.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" 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.xsd">
<!--配置元件掃描--> <context:component-scan base-package="com.itlike.demo1"/> </beans>
  • UserTest
public class UserTest {
    @Test
    public void test(){
        ApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml");
        User user =(User) app.getBean("user");
        System.out.println(user); //有地址說明已經獲取了物件!
    }
}

3.注入屬性值

  • User
@Component("user")  //相當於bean id=""
public class User {
    //使用value註解注入屬性值
    @Value("Hello Spring!")
    public String name;
}
  • applicationContext.xml不變
  • UserTest
System.out.println(user.name); //Hello Spring!

4.衍生註解

  • 為了更好的進行分層,Spring可以使用其它三個註解,功能類似
  • 目前使用哪一個功能都一樣, 後期可能會新增一些屬於各自的屬性
  • @Controller–>web層
  • @Service–>service層
  • @Repository–>dao層
@Controller("user")
public class User {    
    @Value("Hello Spring!")
    public String name;
}  //甚至可以使用Service、Repository

如圖,也可以使用Controller實現相同的作用,目的是更好的進行MVC分層。

5.屬性注入

  • @Value

設定普通屬性值

  • @Autowired

設定物件型別的屬性值,直接使用這種方式,是按照型別完全屬性注入;

  1. Dog:
@Component("dog")
public class Dog {
    @Value("wc")
    public String name;
}
  1. User:
@Controller("user")
public class User {
    @Value("Hello Spring!")
    public String name;
    //這是按照型別的完全屬性注入
    @Autowired
    public Dog dog;
}
  1. UserTest:
System.out.println(user.dog.name); //wc
  1. 但是,習慣上我們是按照名稱完成屬性注入的。如下:
@Controller("user")
public class User {
    @Value("Hello Spring!")
    public String name;
    @Resource(name="dog") /*根據名稱注入*/
    public Dog dog;
}
  • @Scope 設定單例模式、多例模式
@Controller("user")
@Scope("singleton") /*prototype*/
public class User {
   ...
}

6.生命週期

  • @PostConstruct(初始化方法)
  • @PreDestroy(銷燬方法)
  • User:
@Controller("user")
public class User {
    @Value("Hello Spring!")
    public String name;
    @Resource(name="dog") /*根據名稱注入*/
    public Dog dog;

    @PostConstruct
    public void init(){
        System.out.println("init ---");
    }
    @PreDestroy
    public  void destroy(){
        System.out.println("destroy ---");
    }
}
  • UserTest:
@Test
public void test(){
    ClassPathXmlApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml");
    User user =(User) app.getBean("user");
    System.out.println(user.name); //Hello Spring!
    System.out.println(user.dog.name); //wc
    app.close();
    /* result:
    init ---
    Hello Spring !
    wc
    destroy ---
    */
}

7.效益最大化(少數使用)

  • XML與註解比較
  1. XML可以適用任何場景 ,結構清晰,維護方便
  2. 註解不是自己提供的類使用不了,開發簡單方便
  • XML與註解整合開發
  1. XML管理Bean
  2. 註解完成屬性注入
  3. 使用過程中, 可以不用掃描,掃描是為了類上的註解
  4. 在沒有掃描的情況下, 使用屬性註解@Resource @Value @Autowired @Qulifier
  • 步驟如下:
  1. applicationContext.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"
       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.xsd">
        <!--配置元件掃描-->
        <!--<context:component-scan base-package="com.itlike.demo1"/>-->

        <!--在不掃描的情況下,可以使用屬性注入的註解-->
        <context:annotation-config/>
        <bean id="person" class="com.itlike.demo1.Person"/>
</beans>
  1. Person:
public class Person {
    @Value("zs")
    public String name;
}
  1. PersonTest:
public class PersonTest {
    @Test
    public void test(){
        ApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml");
        Person person =(Person) app.getBean("person");
        System.out.println(person.name); //zs
    }
}