容器
- 概念:創(chuàng)建并管理bean的容器
- 創(chuàng)建:使用反射技術(shù)創(chuàng)建bean的實(shí)例
- 設(shè)計(jì):創(chuàng)建對(duì)象的時(shí)候使用工廠模式(BeanFactory)
- 管理:容器中的每個(gè)bean ,Spring默認(rèn)按照單例的方式管理,獲取該Bean多次,為同一個(gè)對(duì)象(hashcode相同),可以通過(guò)設(shè)置scope屬性值更改每次獲取時(shí)創(chuàng)建不同的實(shí)例。
<bean id="MessageServiceBean"class="com.apesource.service.impl.MessageServiceImpl" scope="singleton"/> <bean id="MessageServiceBean" class="com.apesource.service.impl.MessageServiceImpl" scope="prototype"/>
- ApplicationContext:Spring容器的加載,有以下兩種加載方式:
- ClassPathXmlApplicationContext:在classpath路徑下加載xml配置文件,完成Spring容器的加載;或者采用注解方式時(shí),需要在xml配置文件中使用
<context:component-scan/>完成注解的掃描<!--自動(dòng)掃描器:掃描指定包,解析包中的類(lèi)--> <context:component-scan base-package="com.apesource"/>
- AnnotationConfigApplicationContext:基于注解配置的Spring容器加載方式
IOC或DI
- IOC:Inversion of Control(控制反轉(zhuǎn))
- DI:Dependency Injection(依賴(lài)注入)
- 思想:將項(xiàng)目中的類(lèi)(組件)交給Spring容器管理,按照組件之間的彼此的依賴(lài)關(guān)系(采用xml配置文件或者注解),完成組件之間的注入,降低組件之間的耦合。
- 三種注入方式:
1.屬性setter注入,組件要有一個(gè)無(wú)參構(gòu)造方法
2.構(gòu)造注入:使用有參構(gòu)造方法進(jìn)行注入
3.接口注入:需要實(shí)現(xiàn)Spring框架提供的一個(gè)接口
注解:用于標(biāo)注當(dāng)前類(lèi)為Spring容器中的一個(gè)bean(組件)
- 聲明bean
- @Component:組件
- @Controller:控制組件
- @Service:業(yè)務(wù)層組件
- @Repository:數(shù)據(jù)訪問(wèn)層組件
- 聲明注入
一、Spring Framework
- @Autowired:自動(dòng)裝配(默認(rèn)按照類(lèi)型自動(dòng)裝配),按照當(dāng)前聲明的接口類(lèi)型,在容器中查找該接口實(shí)現(xiàn)類(lèi)對(duì)象bean,進(jìn)行自動(dòng)注入(裝配)
- @Qualifier:按照bean名稱(chēng)自動(dòng)裝配,與@Autowired注解配合使用。按照當(dāng)前指定的bean名稱(chēng),在容器中查找該名稱(chēng)對(duì)應(yīng)的bean,進(jìn)行自動(dòng)注入(裝配)
二、Java 標(biāo)準(zhǔn)注解
@Resource:javax擴(kuò)展包提供的注解,完成自動(dòng)注入,默認(rèn)按照類(lèi)型自動(dòng)注入,也可以使用name屬性進(jìn)行按名稱(chēng)自動(dòng)注入。
相關(guān)源代碼如下:
<?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">
<!--配置控制器:將當(dāng)前控制器交給Spring容器管理,由Spring容器負(fù)責(zé)創(chuàng)建對(duì)象并維護(hù)-->
<!--相當(dāng)于:MessageController MessageControllerBean=new MessageController();-->
<!--反射:MessageController MessageControllerBean=Class.forName("com.apesource.web.MessageController").newInstance();-->
<bean id="MessageControllerBean" class="com.apesource.web.MessageController">
<!--Spring三種注入方法-->
<!--1.屬性注入(setter)-->
<!--將容器中的MessageServiceBean,注入當(dāng)前Controller的messageService屬性(通過(guò)該屬性的setter)-->
<!-- <property name="messageService" ref="MessageServiceBean"/>-->
<!--2.構(gòu)造注入(構(gòu)造方法) ref為容器中的對(duì)象 value為其他對(duì)象-->
<constructor-arg name="messageService" ref="MessageServiceBean"/>
<constructor-arg name="message" value="默認(rèn)消息"/>
<!--3.接口注入(不用)-->
</bean>
<!--配置業(yè)務(wù)層-->
<!--以單例的方式管理Bean:默認(rèn)狀態(tài)下,獲取該Bean多次,為同一個(gè)對(duì)象(hashcode相同)-->
<!--默認(rèn)為單例模式:scope屬性為singleton-->
<!--<bean id="MessageServiceBean" class="com.apesource.service.impl.MessageServiceImpl"
scope="singleton">-->
<!--設(shè)置為新實(shí)例:scope屬性為prototype-->
<!--init-method:設(shè)置初始化方法-->
<!-- destroy-method:設(shè)置初銷(xiāo)毀方法-->
<bean id="MessageServiceBean" class="com.apesource.service.impl.MessageServiceImpl"
init-method="init"
destroy-method="destory">
</bean>
</beans>
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
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
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
<!--自動(dòng)掃描器:掃描指定包,解析包中的類(lèi)-->
<context:component-scan base-package="com.apesource"/>
</beans>
@Repository
public class UserDAOImpl implements IUserDAO {
@Override
public void insertUser() {
System.out.println("數(shù)據(jù)訪問(wèn)層:插入一個(gè)用戶信息");
}
@Override
public void updateUser() {
System.out.println("數(shù)據(jù)訪問(wèn)層:更新一個(gè)用戶信息");
}
@Override
public void listUser() {
System.out.println("數(shù)據(jù)訪問(wèn)層:查詢一個(gè)用戶信息");
}
}
@Service("userServiceBean")
public class IUserServiceImpl implements IUserService {
//DAO層組件:自動(dòng)注入
@Autowired
private IUserDAO userDAO;
@Override
public void login() {
System.out.println("業(yè)務(wù)層:登錄");
}
@Override
public void logout() {
System.out.println("業(yè)務(wù)層:退出");
}
@Override
public void register() {
System.out.println("業(yè)務(wù)層:注銷(xiāo)");
userDAO.insertUser();
userDAO.updateUser();
userDAO.updateUser();
}
}
public class Test04 {
public static void main(String[] args) {
ApplicationContext context=new ClassPathXmlApplicationContext("spring-config2.xml");
UserController userController= (UserController) context.getBean("userController");
userController.executeDosth();
}
}
public class Test5 {
public static void main(String[] args) {
//ApplicationContext context=new ClassPathXmlApplicationContext("spring-config2.xml");
ApplicationContext context=new AnnotationConfigApplicationContext("com.apesource");
UserController userController= (UserController) context.getBean("userController");
userController.executeDosth();
}
}
//@Component:注解:用于標(biāo)注當(dāng)前類(lèi)為Spring容器中的一個(gè)bean(組件)
//@Component
@Controller
public class UserController {
//業(yè)務(wù)層組件(接口)
//1.springframework注解
//自動(dòng)裝配:默認(rèn)按類(lèi)型自動(dòng)裝配:按照當(dāng)前接口的類(lèi)型(自動(dòng)在容器中查找接口的實(shí)現(xiàn)類(lèi))
// @Autowired
//@Qualifier("vipUserServiceBean") //按照名稱(chēng)自動(dòng)裝配
//javax提供的標(biāo)準(zhǔn)注入
@Resource(name = "userServiceBean")
private IUserService userService;
public void executeDosth() {
System.out.println("UserController的Dosth方法被執(zhí)行");
userService.login();
userService.logout();
userService.register();
}
}