一、@Component(value="")註解:元件
-
標記在類上,也可以放在介面上
-
註解作用:把AccountDao實現類物件交由Spring IOC容器管理
-
註解Value屬性:相當於bean標籤id,物件在IOC容器中的唯一標識,可以不寫,預設值是當前類首字母縮寫的類名。注入時需要注意此名稱!!。
-
三個衍射註解分別是:@Controller,@Service,@Repository。作用與@Component註解一樣
設計初衷增加程式碼的可讀性,體現在三層架構上:
- @Controller一般標註在表現層
- @Service一般標註在業務層
- @Repository一般 標註在持久層
例子、
註解方式
@Component(value="accountDao")
public class AccountDaoImpl implements AccountDao
相當於XML配置檔案中的Bean標籤
<bean id="accountDao" class="com.itheima.dao.impl.AccountDaoImpl"/>
注意:此註解必須搭配掃描註解使用
例子
註解方式
@Configuration
@ComponentScan("com.*")
public class SpringConfig{}
相當於XML配置檔案中的<context:component-scan>標籤,對註解進行掃描
<context:component-scan base-package="com.*"></context:component-scan>
二、@Autowired註解,自動注入
-
標記在成員變數或set方法上
-
註解作用:@Autowired是spring提供用於給引用型別賦值,有byName和byType兩種方式,預設使用byType方式自動注入,若是要強制至於byName方式注入,要在@Autowired註解下面加入 @Qualifier(value = “bean的id”)註解,required引數預設是true,表示開啟自動裝配,有些時候我們不想使用自動裝配功能,可以將該引數設定成false
例子、
註解方式:在AccountServiceImpl類中注入accountDao物件
@Service
public class AccountServiceImpl implements AccountServic{
@Autowired
private AccountDao accountDao;
}
XML配置檔案方式,自動注入在AccountServiceImpl類中注入accountDao物件
@Service
public class AccountServiceImpl implements AccountServic{
private AccountDao accountDao;
public void setAccountDao(AccountDao accountDao){
this.accountDao = accountDao;
}
}
spring的bean.xml
<bean id="accountService" class="com.itheima.service.impl.AccountServiceImpl" autowire="byType">
- 按照變數的資料型別注入,它只能注入其他的bean型別
4. 注意事項:
成員變數的介面資料型別,有多個實現類的時候,要使用bean的id注入,否則會報錯,因為一個介面被兩個實現類實現,所以根據byType屬性型別注入已經失效了
例子、
@Component("userAnnonService02")
public class UserAnnonServiceImpl01 implements UserAnnonService {}
@Component("userAnnonService01")
public class UserAnnonServiceImpl02 implements UserAnnonService {}
public class Test{
@Autowired
UserAnnonService userAnnonService;
}
解決方案:Spring框架提供的註解必須指定Bean的id,使用@Qualifier的註解配合,@Qualifier註解的value屬性指定bean的id
public class Test{
@Autowired
@Qualifier("userAnnonService01")
UserAnnonService userAnnonService;
}
三、@Resource(name="") 註解,自動注入
-
標記在成員變數或set方法上
-
註解作用:屬於 JDK提供的註解,預設注入方式為 byName。如果無法透過名稱匹配到對應的 Bean 的id話,注入方式會變為byType;該@Resource註解相當於@Autowired的註解與@Qualifier的註解合併
-
name屬性:指定bean的id
-
如果不寫name屬性則按照變數資料型別注入,資料型別是介面的時候注入其實現類。如果定義name屬性,則按照bean的id注入。
-
Java的JDK提供本註解
四、@Configuration註解又稱配置類註解
註解作用:作用等同於beans.xml配置檔案,在當前註解宣告的類中,編寫配置資訊,所以我們把@Configuration宣告的類稱之為配置類。
//透過配置bean.xml的獲取
ApplicationContext ac = new ClassPathXmlApplicationContext("beans.xml");
accountService = ac.getBean("accountService ");
//透過配置類,初始化Spring的ioc容器
ApplicationContext ac = new AnnotationConfigApplicationContext(SpringConfiguration.class);
//獲取AccountService介面的實現類物件
accountService = ac.getBean(AccountService.class);
五、@Import註解
註解作用:匯入其他配置類(物件),標記在類上
例子、
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">
// 匯入dao.xml配置檔案
<import resource="classpath:applicationContext-dao.xml"/>
// 匯入service.xml配置檔案
<import resource="classpath:applicationContext-service.xml"/>
// 匯入mvc.xml配置檔案
<import resource="classpath:applicationContext-mvc.xml"/>
</beans>
使用@Import註解方式
@Import(DaoConfiguration.class)
@Import(ServiceConfiguration.class)
@Import(MvcConfiguration.class)
@Configuration
class MainConfiguration{} // 主配置檔案
@Configuration
class DaoConfiguration{} // dao的配置檔案
@Configuration
class ServiceConfiguration{} // service的配置檔案
@Configuration
class MvcConfiguration{} // mvc的配置檔案
引用場景
1、在配置檔案按配置專案時使用xml分層例如 mvc.xml,dao.xml,service.xml分別配置提高可讀性和可維護性,使用 import 引入同一個xml中進行讀取。
2、多個configuration配置類時使用:@Import(配置類.class) 或 @Import({配置類.class,配置類.class}) 引數為陣列載入多個配置類
六、@PropertySource註解
註解作用:引入外部屬性檔案(db.properties),標記在類上
例子、
XML配置檔案方式
<context:property-placeholder location="classpath:jdbc.properties"/>
使用@PropertySource註解方式
@Configuration
@PropertySource({"db.properties"})
public class SpringConfigClass {}
或
@Configuration
@PropertySource("classpath:db.properties")
public class SpringConfigClass {}
七、@Value註解
註解作用:給簡單型別變數賦值,標記在成員變數或set方法上
例子、
XML配置檔案方式
1、在classpath下新建config.properties
jdbc.user=root
jdbc.password=root
jdbc.driverClass=com.mysql.jdbc.Driver
2、在applicationContex.xml中配置匯入資原始檔
<context:property-placeholder location="classpath:config.properties"/>
3、之後就可以在xml中使用佔位符來獲取properties值
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="user" value="${jdbc.user}"/>
<property name="password" value="${jdbc.password}"></property>
<property name="jdbcUrl" value="${jdbc.jdbcUrl}"></property>
<property name="driverClass" value="${jdbc.driverClass}"></property>
</bean>
使用@Value註解方式
valueDemo.properties資原始檔
valueName=小張
@Configuration
@ComponentScan(value = {"com.yang.SpringTest.annotation.valueLearn"})
@PropertySource(value = {"classpath:valueDemo.properties"})
public class ValueDemoConfig {
@Value("#{valueName}")
private String valueDemoName;
}
八、@Bean註解
註解作用:將方法的返回值儲存到Spring IOC容器中,標記在配置類中的方法上
例子、
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"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<context:property-placeholder location="classpath*:db.properties"/>
<!--注入 druid-->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
<property name="driverClassName" value="${jdbc.driver}"></property>
<property name="url" value="${jdbc.url}"></property>
<property name="username" value="${jdbc.username}"></property>
<property name="password" value="${jdbc.password}"></property>
</bean>
</beans>
使用@Bean註解方式
@Configuration
@PropertySource({"db.properties"})
public class SpringConfigClass {
@Value("${jdbc.driver}")
private String dataSource;
@Value("${jdbc.url}")
private String url;
@Value("${jdbc.username}")
private String userName;
@Value("${jdbc.password}")
private String passWord;
@Bean
public DruidDataSource dataSource() {
DruidDataSource druidDataSource = new DruidDataSource();
druidDataSource.setDriverClassName(dataSource);
druidDataSource.setUrl(url);
druidDataSource.setUsername(userName);
druidDataSource.setPassword(passWord);
return druidDataSource;
}
}
九、@ComponentScan("com.*")註解
註解作用:可以告訴 Spring 在指定的包或類路徑下進行元件掃描,然後自動將被掃描到的元件註冊到 Spring 容器中,標記在配置類上
例子、
XML配置檔案方式
<context:component-scan base-package="com.spring.annotation" use-default-filters="false">
<context:include-filter type="custom" expression="com.spring.annotation.filter.ColorBeanLoadFilter" />
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Component" />
</context:component-scan>
使用@ComponentScan註解方式
@Configuration
@ComponentScan
public class SpringConfigClass {}
@ComponentScan註解的屬性:
-
value:指定要掃描的package; 若value值為空則掃描當前配置類的包以及子包。
-
includeFilters=Filter[]:指定只包含的元件
-
excludeFilters=Filter[]:指定需要排除的元件;
-
useDefaultFilters=true/false:指定是否需要使用Spring預設的掃描規則:被@Component, @Repository, @Service, @Controller或者已經宣告過@Component自定義註解標記的元件;
在過濾規則Filter中:
-
FilterType:指定過濾規則,支援的過濾規則有
-
ANNOTATION:按照註解規則,過濾被指定註解標記的類;
-
ASSIGNABLE_TYPE:按照給定的型別;
-
ASPECTJ:按照ASPECTJ表示式;
-
REGEX:按照正規表示式
-
CUSTOM:自定義規則;
-
value:指定在該規則下過濾的表示式;
掃描指定類檔案 @ComponentScan(basePackageClasses = Person.class) 掃描指定包,使用預設掃描規則,即被@Component, @Repository, @Service, @Controller或者已經宣告過@Component自定義註解標記的元件; @ComponentScan(value = "com.yibai") 掃描指定包,載入被@Component註解標記的元件和預設規則的掃描(因為useDefaultFilters預設為true) @ComponentScan(value = "com.yibai", includeFilters = { @Filter(type = FilterType.ANNOTATION, value = Component.class) }) 掃描指定包,只載入Person型別的元件 @ComponentScan(value = "com.yibai", includeFilters = { @Filter(type = FilterType.ASSIGNABLE_TYPE, value = Person.class) }, useDefaultFilters = false) 掃描指定包,過濾掉被@Component標記的元件 @ComponentScan(value = "com.yibai", excludeFilters = { @Filter(type = FilterType.ANNOTATION, value = Component.class) }) 掃描指定包,自定義過濾規則 @ComponentScan(value = "com.yibai", includeFilters = { @Filter(type = FilterType.CUSTOM, value = ColorBeanLoadFilter.class) }, useDefaultFilters = true
舉例、
@Configuration
@ComponentScan(
includeFilters = {@ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE, value = {UserAllAnnonService.class, UserAllAnnonMapper.class})},
useDefaultFilters = false)
public class SpringConfigClass {}
十、@EnableAspectJAutoProxy註解
註解作用:開啟Aop註解支援,標記在配置類上
例子、
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"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
// 開啟Aop註解支援
<aop:aspectj-autoproxy/>
</beans>
使用@EnableAspectJAutoProxy註解方式
@Configuration
@ComponentScan
@PropertySource("classpath:db.properties")
@ImportResource({"classpath:beans.xml"})
@EnableAspectJAutoProxy
public class SpringConfigClass {...}
十一、@EnableTransactionManagement註解
註解作用:開啟註解事務控制,標記在配置類上
例子、
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"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
// 開啟註解事務控制
<tx:annotation-driven/>
</beans>
使用@EnableTransactionManagement註解方式
@Configuration
@ComponentScan
@PropertySource("classpath:sqlLink.properties")
@ImportResource({"classpath:beans.xml"})
@EnableTransactionManagement
public class SpringConfigClass {...}
十二、@Transactional()註解
註解作用:開啟當前方法的事務支援,標記到方法上
常用屬性:
-
transactionManager 屬性: 設定事務管理器,如果不設定預設是transactionManager。
-
isolation屬性: 設定事務的隔離級別。
-
propagation屬性: 事務的傳播行為
例子、
@Override
@Transactional(transactionManager = "transactionManager", isolation = Isolation.DEFAULT, propagation = Propagation.REQUIRED)
public Integer saveUser(User user) {
Integer integer = userMapper.saveUser(user);
return integer;
}