009_IOC注解开发
一. @Component注解
1. @Component注解, 組件的意思, 修飾一個類, 有一個value屬性, 可以給組件指定一個名字。相當于我們在Spring的XML配置文件里, 配置了一個bean, 給bean指定了一個名字, 并指定類。
2. @Component注解有三個衍生注解, 功能類似, 推薦使用:
2.1. @Controller: 修飾Web層類。
2.2. @Service: 修飾service層類。
2.3. @Repository: 修飾dao層類。
二. 屬性注解
1. 普通屬性注解: @Value設置普通屬性的值。
2. 對象屬性
2.1. @Autowired: 設置對象類型屬性的值。但是是按照類型完成屬性注入的。
2.2. @Qualifier: 按照名稱完成屬性注入。
2.3. 通常@Autowired和@Qualifier注解配合使用, 完成對象類型屬性的按名稱注入。
2.4. @Resource: 完成對象類型屬性的按名稱注入。一個注解完成了@Autowired和@Qualifier兩個注解所做的事情, 推薦使用。
三. IOC注解例子
1. 新建一個名為IOCAnnotation的Java工程, 拷入相關jar包
2. 新建一個名為UserDao.java的接口
package com.lywgames.dao;public interface UserDao {public void save(); }3. 新建一個名為UserDaoImpl.java的類實現UserDao.java接口
package com.lywgames.dao.impl;import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; import com.lywgames.dao.UserDao;@Component(value="userDao") // 相當于我們在Spring的XML配置了一個bean,<bean name="userDao" class="com.lywgames.dao.impl.UserDaoImpl"/> public class UserDaoImpl implements UserDao {@Value("張三") // 注冊普通屬性private String name;@Overridepublic void save() {System.out.println("保存" + name + "成功。");}}4. 新建一個名為UserService.java的接口
package com.lywgames.service;public interface UserService {public void save(); }5. 新建一個名為UserServiceImpl.java的類實現UserService.java接口
package com.lywgames.service.impl;import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.stereotype.Component; import com.lywgames.dao.UserDao; import com.lywgames.service.UserService;@Component(value="userService") // 相當于我們在XML配置了一個bean,<bean name="userService" class="com.lywgames.service.impl.UserServiceImpl"/> public class UserServiceImpl implements UserService {@Autowired // 注冊對象類型@Qualifier(value="userDao") // 按照名稱完成屬性注入private UserDao userDao;@Overridepublic void save() {userDao.save();}}6. 新建一個名為UserAction.java的類
package com.lywgames.web.action;import org.springframework.context.support.ClassPathXmlApplicationContext; import com.lywgames.service.UserService;public class UserAction {public static void main(String[] args) {ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");UserService userService = applicationContext.getBean(UserService.class);userService.save();applicationContext.close();}}7. 在src目錄下創建applicationContext.xml
8. 運行項目
四. Bean生命周期和作用域注解
1. 生命周期相關的注解
1.1. 初始化方法的注解@PostConstruct
1.2. 銷毀方法的注解@PreDestroy
2. bean作用范圍的注解@Scope
2.1. @Scope的值
2.1.1. singleton: 默認單例。
2.1.2. prototype: 多例。
2.1.3. request: 應用在web項目中, Spring創建這個類的對象以后, 將這個對象存入到request范圍中。
2.1.4. session: 應用在web項目中, Spring創建這個類的對象以后, 將這個對象存入到session范圍中。
2.2. 添加@Scope注解
五. Bean生命周期和作用域注解
1. 新建一個名為IOCAnnotationLifeCycle的Java工程, 拷入相關jar包
2. 新建一個名為UserDao.java的接口
package com.lywgames.dao;public interface UserDao {public void save(); }3. 新建一個名為UserDaoImpl.java的類實現UserDao.java接口
package com.lywgames.dao.impl;import javax.annotation.PostConstruct; import javax.annotation.PreDestroy; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Repository; import com.lywgames.dao.UserDao;@Repository(value="userDao") // 相當于我們在XML配置了一個bean,<bean name="userDao" class="com.lywgames.dao.impl.UserDaoImpl"/> @Scope(value="prototype") public class UserDaoImpl implements UserDao {@Value("張三") // 注冊普通屬性private String name;public UserDaoImpl() {System.out.println("UserDaoImpl被創建了");}@PostConstructpublic void init() {System.out.println("UserDaoImpl被初始化了");}@Overridepublic void save() {System.out.println("保存" + name + "成功。");}@PreDestroypublic void destroy() {System.out.println("UserDaoImpl被銷毀了");}}4. 新建一個名為UserService.java的接口
package com.lywgames.service;public interface UserService {public void save(); }5. 新建一個名為UserServiceImpl.java的類實現UserService.java接口
package com.lywgames.service.impl;import javax.annotation.Resource; import org.springframework.stereotype.Service; import com.lywgames.dao.UserDao; import com.lywgames.service.UserService;@Service(value="userService") // 相當于我們在XML配置了一個bean,<bean name="userService" class="com.lywgames.service.impl.UserServiceImpl"/> public class UserServiceImpl implements UserService {@Resource(name="userDao") // 完成對象的按名稱注入private UserDao userDao;@Overridepublic void save() {userDao.save();}}6. 新建一個名為UserAction.java的類
package com.lywgames.web.action;import org.springframework.context.support.ClassPathXmlApplicationContext; import com.lywgames.service.UserService;public class UserAction {public static void main(String[] args) {ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");UserService userService = applicationContext.getBean(UserService.class);userService.save();applicationContext.close();}}7. 在src目錄下創建applicationContext.xml
8. 運行項目
六. XML方式和注解方式
1. XML方式和注解方式比較
| ? | 基于XML配置 | 基于注解配置 |
| Bean定義 | <bean id="" class=""/> | @Component: 修飾一個類 ? @Component的衍生類 @Controller: 修飾Web層類 @Service: 修飾service層類 @Repository: 修飾dao層類 |
| Bean名稱 | 通過id或name指定 | @Component(value="") |
| Bean注入 | 構造函數注入: <constructor-arg name="id" value="101"/> 屬性注入: <property name="id" value="102"/> p命名空間: <bean p:id="" p:teacher-ref=""/> SpEL表達式: <property name=="" value="#{}"/> | @Autowired: 按類型注入 @Qualifier(value=""):? 按照名稱完成屬性注入 ? @Resource(name=""): 完成對象類型屬性的按名稱注入 |
| 聲明周期 | <bean init-method="" destroy-method=""/> | @PostConstruct初始化 @PreDestroy銷毀 |
| Bean作用范圍 | <bean scope=""/> | @Scope(value="") |
| 適用場景 | 適用性更廣, 結構更加清晰。 | 適用類是自己定義, 開發更方便。 |
2. XML和注解的整合開發
2.1. XML定義類
2.2. 注解屬性注入
七. XML和注解的整合開發例子
1. 新建一個名為IOCXMLAnnotation的Java工程, 拷入相關jar包
2. 新建一個名為UserDao.java的接口
package com.lywgames.dao;public interface UserDao {public void save(); }3. 新建一個名為UserDaoImpl.java的類實現UserDao.java接口
package com.lywgames.dao.impl;import org.springframework.beans.factory.annotation.Value; import com.lywgames.dao.UserDao;public class UserDaoImpl implements UserDao {@Value("張三") // 注冊普通屬性private String name;@Overridepublic void save() {System.out.println("保存" + name + "成功。");}}4. 新建一個名為UserService.java的接口
package com.lywgames.service;public interface UserService {public void save(); }5. 新建一個名為UserServiceImpl.java的類實現UserService.java接口
package com.lywgames.service.impl;import javax.annotation.Resource; import com.lywgames.dao.UserDao; import com.lywgames.service.UserService;public class UserServiceImpl implements UserService {@Resource(name="userDao") // 完成對象的按名稱注入private UserDao userDao;@Overridepublic void save() {userDao.save();}}6. 新建一個名為UserAction.java的類
package com.lywgames.web.action;import org.springframework.context.support.ClassPathXmlApplicationContext; import com.lywgames.service.UserService;public class UserAction {public static void main(String[] args) {ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");UserService userService = applicationContext.getBean(UserService.class);userService.save();applicationContext.close();}}7. 在src目錄下創建applicationContext.xml
8. 運行項目
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的009_IOC注解开发的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 008_多配置文件的引入
- 下一篇: 010_AOPXml方式开发