1、注解
注解就是一個類,使用@加上注解名稱,開發中可以使用注解取代配置文件
2、@Component 取代<bean class="">,@Component 取代<bean id="" class="">
(1)創建一個類(該類與dao層無聯系,是一個單獨的類)
@Component("studentService") public class StudentServiceImpl implements StudentService { public void addStudent(){ System.out.println("StudentService的實現類的Add方法!!"); } }
(2)創建配置文件:
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns="http://www.springframework.org/schema/beans" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <context:component-scan base-package="pers.zhb.service"></context:component-scan> </beans>
(3)測試類:
public class TestCycle { public static void main(String[] args) { ApplicationContext applicationContext=new ClassPathXmlApplicationContext("applicationContext.xml");//創建容器對象 StudentService studentService= (StudentService) applicationContext.getBean("studentService"); studentService.addStudent(); } }
(4)web開發中,提供了3個@Component注解的衍生注解(功能一樣),它們是spring框架為我們提供的三層使用的注解,使得我們的三層對象更加清晰
@Repository:dao層(持久層)與@Mapper的區別是,@resposity需要配置掃描,而@Mapper不需要它是利用的XML里的NameSpace
@Service:service層(業務層)
@Controller:web層(表現層)
(5)@Component注解
作用:用於把當前類的對象存入到spring容器中
屬性:
value:指定bean的id,不寫的時候默認是當前的類名,且首字母小寫。當指定屬性的值的時候就要用該值
3、依賴注入
(1)創建一個Action:
@Controller("studentAction") public class StudentAction { @Autowired//默認按照類型注入 private StudentService studentService; public void execute(){ studentService.addStudent(); } }
使用@Autowired注解(依賴注入)的時候可以寫在屬性或set方法處,寫在屬性處可以節省代碼量,優先按照bean的類型去找。
(2)service層:
public interface StudentService { public void addStudent(); }
@Service public class StudentServiceImpl implements StudentService { private StudentDao studentDao; @Qualifier("studentDao") public StudentDao getStudentDao() { return studentDao; } @Autowired public void setStudentDao(StudentDao studentDao) { this.studentDao = studentDao; } public void addStudent(){ studentDao.addStudent(); } }
(3)dao層:
public interface StudentDao { public void addStudent(); }
@Repository("studentDao") public class StudentDaoImpl implements StudentDao { @Override public void addStudent() { System.out.println("StudentDao的實現類的Add方法!!"); } }
(4)配置文件:
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns="http://www.springframework.org/schema/beans" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <!--掃描--> <context:component-scan base-package="pers.zhb"></context:component-scan> </beans>
(5)測試:
public class ActionTest { public static void main(String[] args) { ApplicationContext applicationContext=new ClassPathXmlApplicationContext("applicationContext.xml");//創建容器對象 StudentAction studentAction= (StudentAction) applicationContext.getBean("studentAction"); studentAction.execute(); } }
StudentDao的實現類的Add方法!!
@Autowired
- 可以省略類內的get和set方法以及配置文件中bean的依賴注入的內容,但是在spring容器中還是需要配置bean的,可以結合生成bean的注解使用
- 自動按照類型注入,只要容器中有唯一一個bean對象類型和要注入的變量類型匹配,就可以注入成功
- 出現的位置可以是變量上也可以是方法上
- 按照類型注入的時候,如果有多個可以注入,不能注入成功的時候,可以按照名稱注入(需要手動修改注入的變量名稱),例如,一個接口有多個實現類,那么這些實現類就是相同類型的,注入的時候會出現問題,因為注入的時候匹配到了多個bean
@Qualifier
屬性value用於指定注入的bean的id
在給類成員注入的時候不能獨立使用,也就是說要和Autowired注解配合使用。當有多個相同類 型 的 bean 卻只 有 一個需 要 自 動 裝 配 時 , 將 @Qualifier 注 解 和@Autowire 注解結合使用以消除這種混淆, 指定需要裝配的確切的 bean。
@Resource
直接按照bean的id注入,可以獨立使用
屬性可以指定bean的id
以上三種注解都是能用於注入bean類型的數據,而基本類型和String類型無法使用上述注解
@Value:用於注入基本類型和String類型,屬性用於指定值
@Required :如果你在某個java類的某個set方法上使用了該注釋,那么該set方法對應的屬性在xml配置文件中必須被設置,否則就會拋出BeanInitializationException。
4、生命周期
初始化:@PostConstruct
銷毀:@PreDestory
分別添加到初始化和銷毀方法之前。
5、bean的作用域
(1)單例對象singleton(缺省)
測試:
Student student1 =(Student)applicationContext.getBean("student"); Student student2 =(Student)applicationContext.getBean("student"); System.out.println(student1==student2);
返回結果為true,說明創建的是同一個對象。在spring容器中只存在一個bean的實例,bean以單里的形式存在
(2)多例對象prototype
測試:
Student student1 =(Student)applicationContext.getBean("student"); Student student2 =(Student)applicationContext.getBean("student"); System.out.println(student1==student2);
返回的結果為false,創建的是兩個不同的對象。每次調用getBean()的時候都會返回一個新的實例
(3)request
request: 每次 http 請求都會創建一個 bean, 該作用域僅在基於 web 的 Spring ApplicationContext 情形下有效
(4)session
session: 在一個 HTTP Session 中, 一個 bean 定義對應一個實例(同一個Session共享一個Bean實例)。 該作用域僅在基於 web 的 Spring ApplicationContext 情形下有效。
(5)global-session
global-session:同session作用域不同的是,所有的Session共享一個Bean實例。 該作用域僅在基於 web 的 Spring ApplicationContext 情形下有效。