040_Spring註解開發

Spring註解開發

image.png

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="//www.springframework.org/schema/beans"
       xmlns:xsi="//www.w3.org/2001/XMLSchema-instance"
       xmlns:context="//www.springframework.org/schema/context"
       xsi:schemaLocation="//www.springframework.org/schema/beans
        //www.springframework.org/schema/beans/spring-beans.xsd
        //www.springframework.org/schema/context
        //www.springframework.org/schema/context/spring-context.xsd">

    <!--註解支持-->
    <context:annotation-config/>

</beans>

bean註冊到Spring容器中

applicationContext.xml添加包掃描註解

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="//www.springframework.org/schema/beans"
       xmlns:xsi="//www.w3.org/2001/XMLSchema-instance"
       xmlns:context="//www.springframework.org/schema/context"
       xsi:schemaLocation="//www.springframework.org/schema/beans
        //www.springframework.org/schema/beans/spring-beans.xsd
        //www.springframework.org/schema/context
        //www.springframework.org/schema/context/spring-context.xsd">

    <!--註解支持-->
    <context:annotation-config/>
    <!--指定要掃描的包,包下的註解就會生效-->
    <context:component-scan base-package="com.qing"/>

</beans>

實體類添加註解@Component

package com.qing.dao;

import org.springframework.stereotype.Component;

@Component
public class User {
    private String name;
}

import com.qing.dao.User;
import org.junit.jupiter.api.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class MyTest {
    @Test
    public void test01(){
        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
        User user = context.getBean("user", User.class);
        System.out.println(user.getName());
    }
}

image.png
User實體類被Spring管理,通過@Component註解註冊到Spring容器中

屬性注入

屬性添加註解@Value(“張三丰”)

package com.qing.pojo;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

@Component
public class User {
    @Value("張三丰")
    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

import com.qing.pojo.User;
import org.junit.jupiter.api.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class MyTest {
    @Test
    public void test01(){
        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
        User user = context.getBean("user", User.class);
        System.out.println(user.getName());
    }
}

image.png

@Component的衍生註解

在web開發中,會按照MVC三層架構分層,分別使用註解,但他們的作用和@Component註解是一樣的,都是將類註冊到spring容器中,只是為了標記分層使用不同的註解

dao層 @Repository

package com.qing.dao;

import org.springframework.stereotype.Repository;

@Repository
public class UserDao {
}

service層 @Service

package com.qing.service;

import org.springframework.stereotype.Service;

@Service
public class UserService {
}

controller層 @Controller

package com.qing.controller;

import org.springframework.stereotype.Controller;

@Controller
public class UserController {
}

自動裝配

image.png

作用域

單例@Scope(“singleton”) 原型@Scope(“prototype”)

package com.qing.pojo;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;

@Component
@Scope("singleton")
//@Scope("prototype")
public class User {
    @Value("張三丰")
    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

xml與註解區別

image.png

@Configuration 不使用Spring的xml配置,完全Java來做

JavaConfig是Spring的一個子項目,在Spring4之後,它成為了一個核心功能

添加配置類

@Configuration代表這是一個配置類

package com.qing.config;

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;

// @Configuration代表這是一個配置類,相當於applicationContext.xml
@Configuration
// @ComponentScan 掃描包下注解
@ComponentScan("com.qing.pojo")
// @Import 導入其他配置類
@Import(QingConfig2.class)
public class QingConfig {
}

實體類添加註解

package com.qing.pojo;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

@Component
public class User {
    @Value("張三丰")
    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

測試

import com.qing.config.QingConfig;
import com.qing.pojo.User;
import org.junit.jupiter.api.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class MyTest {
    @Test
    public void test01(){
        // 通過AnnotationConfigApplicationContext獲取容器,通過配置類的class加載
        ApplicationContext context = new AnnotationConfigApplicationContext(QingConfig.class);
        User user = context.getBean("user", User.class);
        System.out.println(user.getName());
    }
}

image.png