3. 基於註解方式管理Bean
1. 什麼是註解
(1)註解是程式碼中的特殊標記,格式為:@註解名稱(屬性名稱=屬性值, 屬性名稱=屬性值, …)
(2)註解可以作用在類、方法、屬性上面
(3)使用註解的目的:簡化xml配置
2. 使用註解管理Bean
2.1 基於註解方式建立物件
2.1.1 註解說明
- @Component
- @Service
- @Controller
- @Repository
上面四個註解功能是一樣的,都可以用來建立bean例項,為了區分不同層級的功能,因此建議不同的層級用不同註解進行表示
2.1.2 程式碼實現
-
引入依賴
需要引入apo依賴
-
開啟元件掃描
<?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"> <!-- 開啟元件掃描 1. 如果掃描多個包,多個包之間使用逗號分隔 2. 直接掃描上次目錄 --> <context:component-scan base-package="com.study.spring5.demo10"></context:component-scan> </beans>
-
建立UserService類,在類上面新增建立物件的註解
import org.springframework.stereotype.Component; import org.springframework.stereotype.Service; //@Component(value = "userService") //@Component @Service // 等同於在配置檔案中寫 <bean id="userService" class="..."> // 在註解裡面value屬性值可以省略不寫,預設值就是類名稱的首字母小寫 UserService => userService public class UserService { public void add() { System.out.println("service add"); } }
-
建立主方法
public class Main { public static void main(String[] args) { ApplicationContext applicationContext = new ClassPathXmlApplicationContext("bean10.xml"); UserService userService = applicationContext.getBean("userService", UserService.class); userService.add(); } }
2.2 元件掃描配置
UserService類
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Controller;
import org.springframework.stereotype.Service;
//@Component(value = "userService")
//@Component
//@Service
@Controller // 由於配置檔案的配置,只能使用@Controller註解才會被掃描到
// 等同於在配置檔案中寫 <bean id="userService" class="...">
// 在註解裡面value屬性值可以省略不寫,預設值就是類名稱的首字母小寫 UserService => userService
public class UserService {
public void add() {
System.out.println("service add");
}
}
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">
<!-- 元件掃描配置 只掃描用Controller註解宣告的類
use-default-filters屬性用來控制是否使用預設filter進行掃描
-->
<context:component-scan base-package="com.study.spring5.demo11" use-default-filters="false">
<context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>
<!-- 元件掃描配置 不掃描用Component註解宣告的類 不需要配置 use-default-filters屬性 -->
<context:component-scan base-package="com.study.spring5.demo11">
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Component"/>
</context:component-scan>
</beans>
主方法
public class Main {
public static void main(String[] args) {
ApplicationContext applicationContext =
new ClassPathXmlApplicationContext("bean11.xml");
UserService userService = applicationContext.getBean("userService", UserService.class);
userService.add();
}
}
2.3 基於註解方式實現屬性注入
2.3.1 註解說明
-
@Autowired
根據屬性型別進行自動注入
-
@Qualifier
根據屬性名稱進行注入
-
@Resource
可以根據型別注入,也可以根據名稱注入
-
@Value
注入普通型別屬性
2.3.2 程式碼實現
-
@Autowired
第一步:建立service和dao物件,在service和dao類新增建立物件的註解
UserService類
@Service public class UserService { public void add() { System.out.println("UserService::add"); } }
UserDao介面
public interface UserDao { void add(); }
UserDao介面實現類UserDaoImpl
@Repository public class UserDaoImpl implements UserDao { @Override public void add() { System.out.println("UserDaoImpl::add"); } }
第二步:在service注入dao物件,在UserServiceImpl類新增UserDao型別屬性
將UserService改為以下內容
@Service public class UserService { // 定義dao型別屬性,不需要新增set方法 // 新增註入屬性註解 @Autowired private UserDao userDao; public void add() { System.out.println("UserService::add"); userDao.add(); } }
主方法
public class Main { public static void main(String[] args) { ApplicationContext applicationContext = new ClassPathXmlApplicationContext("bean12.xml"); UserService userService = applicationContext.getBean("userService", UserService.class); userService.add(); } }
-
@Qualifier
需要和@Autowired一起使用
用於當一個介面有多個實現類時候,按照名稱注入指定的實現類
UserDaoImpl改為
@Repository(value = "userDaoImpl") public class UserDaoImpl implements UserDao { @Override public void add() { System.out.println("UserDaoImpl::add"); } }
UserService改為
@Service public class UserService { // 定義dao型別屬性,不需要新增set方法 // 新增註入屬性註解 @Autowired // 當有多個實現類時,按照指定的名稱注入實現類,預設不寫的話,則注入類名稱首字母小寫後的類 UserDao => userDao @Qualifier(value = "userDaoImpl") private UserDao userDao; public void add() { System.out.println("UserService::add"); userDao.add(); } }
-
@Resource(spring不建議使用)
JDK11版本及以上需要引用javax.annotation-api才可使用@Resource註解
將UserService改為
@Service public class UserService { // @Resource @Resource(name = "userDaoImpl") // 根據名稱進行注入 private UserDao userDao; public void add() { System.out.println("UserService::add"); userDao.add(); } }
-
@Value
UserService改寫為
@Service public class UserService { // @Resource @Resource(name = "userDaoImpl") // 根據名稱進行注入 private UserDao userDao; @Value(value = "注入的名稱") private String name; public void add() { System.out.println("UserService::add"); userDao.add(); System.out.println("注入的name值:" + name); } }
2.4 完全註解開發
-
建立配置類,替代xml配置檔案
import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; // 宣告該類作為配置類 @Configuration // @ComponentScan(basePackages = {"com.study.spring5.demo13"}) // 等同於<context:component-scan base-package="com.study.spring5.demo13"/> @ComponentScan(basePackages = {"com.study.spring5.demo13"}) public class SpringConfig { }
-
編寫UserDao介面
public interface UserDao { void add(); }
-
編寫UserDaoImpl實現類
@Repository public class UserDaoImpl implements UserDao { @Override public void add() { System.out.println("UserDaoImpl::add"); } }
-
編寫主方法
public class Main { public static void main(String[] args) { // 載入配置類,通過配置類載入配置,替代掉xml ApplicationContext applicationContext = new AnnotationConfigApplicationContext(SpringConfig.class); UserService userService = applicationContext.getBean("userService", UserService.class); userService.add(); } }
相關文章
- 3_基於註解管理Bean物件Bean物件
- SpringBoot基於註解方式配置FilterSpring BootFilter
- Spring中基於註解方式的AOP操作Spring
- @Bean 註解Bean
- spring上 -基於註解配置bean,動態代理,AOP筆記SpringBean筆記
- spring通過註解註冊bean的方式+spring生命週期SpringBean
- Java開發學習(十一)----基於註解開發bean作用範圍與生命週期管理JavaBean
- Java開發學習(十)----基於註解開發定義beanJavaBean
- spring註冊bean的幾種方式SpringBean
- 基於Springboot+Dubbo+Nacos 註解方式實現微服務呼叫Spring Boot微服務
- 基於註解的方式使用spring-integration-redis分散式鎖SpringRedis分散式
- @Configuration, @Bean 註解的作用Bean
- 【Spring 註解】@Configuration和@BeanSpringBean
- SpringBoot基礎篇Bean之條件注入之註解使用Spring BootBean
- SpringBoot2 基礎案例(13):基於Cache註解,管理Redis快取Spring BootRedis快取
- SpringBoot(14)—註解裝配BeanSpring BootBean
- Java開發學習(十三)----基於註解開發定義第三方bean及註解開發總結JavaBean
- Hibernate 註解方式
- Spring中用註解建立bean例項SpringBean
- spring註解@lazy,bean懶載入SpringBean
- spring註解開發(一)Bean注入SpringBean
- Spring基於註解的aop配置Spring
- Spring基於註解的IoC配置Spring
- spring事物配置,宣告式事務管理和基於@Transactional註解的使用Spring
- 基於SpringBoot的後臺管理系統(異常、註解、node、page)(二)Spring Boot
- Spring的Bean生命週期中@PostConstruct註解SpringBeanStruct
- SpringBoot基礎篇Bean之動態註冊Spring BootBean
- Spring Aop基於註解的實現Spring
- Spring基礎之 IOC九種bean宣告方式SpringBean
- Spring基礎使用(一)--------IOC、Bean的XML方式SpringBeanXML
- Go語言基於go module方式管理包(package)GoPackage
- Spring基於註解實現 AOP 切面功能Spring
- 快速搭建基於註解的 Dubbo 專案
- 多表聯合查詢 - 基於註解SQLSQL
- 【Spring註解驅動開發】在@Import註解中使用ImportBeanDefinitionRegistrar向容器中註冊beanSpringImportBean
- springboot註解實現非同步呼叫時no bean of type TaskExecutor and no bean named 'taskExecutor' eitherSpring Boot非同步Bean
- 省掉bean自定義spring mvc註解注入json值BeanSpringMVCJSON
- 【Spring註解驅動開發】在@Import註解中使用ImportSelector介面匯入beanSpringImportBean