

/**
* 賬戶的業務層實現類
*
* 曾經XML的配置:
* <bean id="accountService" class="com.itheima.service.impl.AccountServiceImpl"
* scope="" init-method="" destroy-method="">
* <property name="" value="" | ref=""></property>
* </bean>
*
* 用于創建對象的
* 他們的作用就和在XML配置文件中編寫一個<bean>標簽實現的功能是一樣的
* Component:
* 作用:用于把當前類對象存入spring容器中
* 屬性:
* value:用于指定bean的id。當我們不寫時,它的默認值是當前類名,且首字母改小寫。
* Controller:一般用在表現層
* Service:一般用在業務層
* Repository:一般用在持久層
* 以上三個注解他們的作用和屬性與Component是一模一樣。
* 他們三個是spring框架為我們提供明確的三層使用的注解,使我們的三層對象更加清晰
*
*
* 用于注入數據的
* 他們的作用就和在xml配置文件中的bean標簽中寫一個<property>標簽的作用是一樣的
* Autowired:
* 作用:自動按照類型注入。只要容器中有唯一的一個bean對象類型和要注入的變量類型匹配,就可以注入成功
* 如果ioc容器中沒有任何bean的類型和要注入的變量類型匹配,則報錯。
* 如果Ioc容器中有多個類型匹配時:
* 出現位置:
* 可以是變量上,也可以是方法上
* 細節:
* 在使用注解注入時,set方法就不是必須的了。
* Qualifier:
* 作用:在按照類中注入的基礎之上再按照名稱注入。它在給類成員注入時不能單獨使用。但是在給方法參數注入時可以(稍后我們講)
* 屬性:
* value:用于指定注入bean的id。
* Resource
* 作用:直接按照bean的id注入。它可以獨立使用
* 屬性:
* name:用于指定bean的id。
* 以上三個注入都只能注入其他bean類型的數據,而基本類型和String類型無法使用上述注解實現。
* 另外,集合類型的注入只能通過XML來實現。
*
* Value
* 作用:用于注入基本類型和String類型的數據
* 屬性:
* value:用于指定數據的值。它可以使用spring中SpEL(也就是spring的el表達式)
* SpEL的寫法:${表達式}
*
* 用于改變作用范圍的
* 他們的作用就和在bean標簽中使用scope屬性實現的功能是一樣的
* Scope
* 作用:用于指定bean的作用范圍
* 屬性:
* value:指定范圍的取值。常用取值:singleton prototype
*
* 和生命周期相關 了解
* 他們的作用就和在bean標簽中使用init-method和destroy-methode的作用是一樣的
* PreDestroy
* 作用:用于指定銷毀方法
* PostConstruct
* 作用:用于指定初始化方法
*/

AccountDaoImpl
package com.itheima.dao.impl;import com.itheima.dao.IAccountDao;
import org.springframework.stereotype.Repository;/*** 賬戶的持久層實現類*/
@Repository("accountDao1")
public class AccountDaoImpl implements IAccountDao{public void saveAccount(){System.out.println("保存了賬戶1111111111111");}
}
AccountDaoImpl2
package com.itheima.dao.impl;import com.itheima.dao.IAccountDao;
import org.springframework.stereotype.Repository;/*** 賬戶的持久層實現類*/
@Repository("accountDao2")
public class AccountDaoImpl2 implements IAccountDao {public void saveAccount(){System.out.println("保存了賬戶2222222222222");}
}
IAccountDao
package com.itheima.dao;/*** 賬戶的持久層接口*/
public interface IAccountDao {/*** 模擬保存賬戶*/void saveAccount();
}
AccountServiceImpl
package com.itheima.service.impl;import com.itheima.dao.IAccountDao;
import com.itheima.service.IAccountService;
import org.springframework.stereotype.Service;import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import javax.annotation.Resource;/*** 賬戶的業務層實現類** 曾經XML的配置:* <bean id="accountService" class="com.itheima.service.impl.AccountServiceImpl"* scope="" init-method="" destroy-method="">* <property name="" value="" | ref=""></property>* </bean>** 用于創建對象的* 他們的作用就和在XML配置文件中編寫一個<bean>標簽實現的功能是一樣的* Component:* 作用:用于把當前類對象存入spring容器中* 屬性:* value:用于指定bean的id。當我們不寫時,它的默認值是當前類名,且首字母改小寫。* Controller:一般用在表現層* Service:一般用在業務層* Repository:一般用在持久層* 以上三個注解他們的作用和屬性與Component是一模一樣。* 他們三個是spring框架為我們提供明確的三層使用的注解,使我們的三層對象更加清晰*** 用于注入數據的* 他們的作用就和在xml配置文件中的bean標簽中寫一個<property>標簽的作用是一樣的* Autowired:* 作用:自動按照類型注入。只要容器中有唯一的一個bean對象類型和要注入的變量類型匹配,就可以注入成功* 如果ioc容器中沒有任何bean的類型和要注入的變量類型匹配,則報錯。* 如果Ioc容器中有多個類型匹配時:* 出現位置:* 可以是變量上,也可以是方法上* 細節:* 在使用注解注入時,set方法就不是必須的了。* Qualifier:* 作用:在按照類中注入的基礎之上再按照名稱注入。它在給類成員注入時不能單獨使用。但是在給方法參數注入時可以(稍后我們講)* 屬性:* value:用于指定注入bean的id。* Resource* 作用:直接按照bean的id注入。它可以獨立使用* 屬性:* name:用于指定bean的id。* 以上三個注入都只能注入其他bean類型的數據,而基本類型和String類型無法使用上述注解實現。* 另外,集合類型的注入只能通過XML來實現。** Value* 作用:用于注入基本類型和String類型的數據* 屬性:* value:用于指定數據的值。它可以使用spring中SpEL(也就是spring的el表達式)* SpEL的寫法:${表達式}** 用于改變作用范圍的* 他們的作用就和在bean標簽中使用scope屬性實現的功能是一樣的* Scope* 作用:用于指定bean的作用范圍* 屬性:* value:指定范圍的取值。常用取值:singleton prototype** 和生命周期相關 了解* 他們的作用就和在bean標簽中使用init-method和destroy-methode的作用是一樣的* PreDestroy* 作用:用于指定銷毀方法* PostConstruct* 作用:用于指定初始化方法*/
@Service("accountService")
//@Scope("prototype")
public class AccountServiceImpl implements IAccountService {// @Autowired
// @Qualifier("accountDao1")@Resource(name = "accountDao2")private IAccountDao accountDao = null;@PostConstructpublic void init(){System.out.println("初始化方法執行了");}@PreDestroypublic void destroy(){System.out.println("銷毀方法執行了");}public void saveAccount(){accountDao.saveAccount();}
}
IAccountService
package com.itheima.service;/*** 賬戶業務層的接口*/
public interface IAccountService {/*** 模擬保存賬戶*/void saveAccount();
}
Client
package com.itheima.ui;import com.itheima.service.IAccountService;
import org.springframework.context.support.ClassPathXmlApplicationContext;/*** 模擬一個表現層,用于調用業務層*/
public class Client {/*** @param args*/public static void main(String[] args) {//1.獲取核心容器對象
// ApplicationContext ac = new ClassPathXmlApplicationContext("bean.xml");ClassPathXmlApplicationContext ac = new ClassPathXmlApplicationContext("bean.xml");//2.根據id獲取Bean對象IAccountService as = (IAccountService)ac.getBean("accountService");
// IAccountService as2 = (IAccountService)ac.getBean("accountService");
// System.out.println(as);
// IAccountDao adao = ac.getBean("accountDao",IAccountDao.class);
// System.out.println(adao);
// System.out.println(as == as2);as.saveAccount();ac.close();}
}
bean.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/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsd"><!--告知spring在創建容器時要掃描的包,配置所需要的標簽不是在beans的約束中,而是一個名稱為context名稱空間和約束中--><context:component-scan base-package="com.itheima"></context:component-scan>
</beans>
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.itheima</groupId><artifactId>day02_eesy_01anno_ioc</artifactId><version>1.0-SNAPSHOT</version><packaging>jar</packaging><dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.0.2.RELEASE</version></dependency></dependencies>
</project>