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
https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
https://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="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
https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
https://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());
}
}


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());
}
}

@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 {
}

自動裝配

作用域

單例@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與註解區別

@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());
}
}