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