非常重要】 組件掃描(Component-Scan)
- 通過配置組件掃描,可以使得spring自動掃描package,而不必在spring的配置文件中逐一聲明各個
<bean>
- 在配置組件掃描時,指定的包是“根包”,即例如指定了
cn.tedu.spring
,spring不只會掃描這個包,還會掃描它的各個層級子包,例如:cn.tedu.spring.dao
- 直接在spring的配置文件中開啟組件掃描即可
<context:component-scan base-package="cn.tedu.spring"></context:component-scan>
- 注意: 僅僅開啟組件掃描
spring
是不會自動管理bean的,而是自動的掃描package
,要想自動管理bean,那么還需要配置注解
注解
- 在類的聲明上方添加
@Component
注解,可以是的spring知道這個類是一個組件,需要進行管理,所以如過某個類需要被Spring管理,應該將這個類放在被掃描的包中,並且添加注解 - 由Spring掃描到的組件(由
@Component
注解標記的類),會由Spring自動設置Bean Id
,值為將類名首字母小寫的名稱,例如組件類的名稱是UserDao
,則配置的Bean的id是userDao
,如果需要自定義Bean,那么可以直接在注解中設置,比如@Component("id")
前提
- 一定要是在開啟組件掃描的包下使用注解,否則將不會掃描到配置的注解
常用注解
- 可以混用,暫時這幾個注解沒有差異,完全功能相同,但是我們還是要根據規則使用
@Component
: 通用注解@Service
: 用於對業務邏輯類的注解(Service層)@Controller
: 用於對控制器類的注解@Repository
:用於對持久層處理類的注解(Dao層)@Named
:通用注解(不用)- 以上5個注解從實現目標和效果是等效的,但是基於方便理解代碼的目的,應該按需使用,了;例如對名為
UserService
類的,應該使用@Service
其他注解
@Scope
- 在類的聲明語句上方添加這個注解,用於設置bean的作用域,比如
@Scope("prototype")
表示非單例,默認是單例
@Lazy
- 在單例模式下設置是否懶加載,例如
@Lazy("true")
用於設置成懶加載 - 在類的聲明語句上方添加
- 前面之前已經說過,在創建Bean的時候默認使用的是單例模式下的餓漢式的創建,即是在spring配置文件加載的時候創建
@PostConstruct
- 將方法設置為生命周期的初始化方法
- 設置初始化方法,直接在初始化方法的聲明語句中添加即可
@PostConstruct
public void init(){ System.out.println("初始化方法"); }
@PreDestroy(單例模式下才會銷毀)
- 在方法的聲明語句上方使用,可以將這個方法設置為生命周期的銷毀方法
@PreDestroy
public void destroy(){ System.out.println("銷毀方法"); }
注入值
@Autowired (不推薦使用)
- 在類中,在聲明屬性的上方添加
@Autowired
,用於標記該屬性是自動裝配值 - 這種自動裝配默認按照類型(
byType
)實現自動裝配 - 如果需要按照名稱(byName)來自動裝配,還需要使用
@Qualifier("userDao")
來組合使用,注解中配置的名稱是需要注入的值的Bean-Id
UserDao
@Repository("userDao") public class UserDaoImpl implements UserDao{ public void reg() { System.out.println("reg"); } }
UserService
@Service
public class UserService { @Autowired @Qualifier("userDao") private UserDao userDao; public void reg(){ userDao.reg(); } }
@Resource (推薦使用)
- 在需要注入的屬性的上方添加該注解
- 默認先按照名稱來自動裝配的(byName),如果名稱對應不上,那么按照類型(byType)進行匹配
@Resource
private UserDao userDao;
- 如果使用
@Resource(name="userDaoImpl")
,name屬性指定的是Bean Id
,添加了name屬性,那么只是按照名稱來裝配,如果這個名稱對應的Bean不存在,那么就注入失敗
@Resource(name="userDaoImpl") private UserDao userDao;
@Value
- 使用
@Value
注解添加在屬性的聲明的上方,可以對屬性注入值 - 直接注入值
@Value("陳加兵") private String name;
- 在使用
@Value("#{beanId.屬性名}")
的注解時還可以使用Spring表達式
https://cloud.tencent.com/developer/article/1120386