spring注解(Component、依賴注入、生命周期、作用域)


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 情形下有效。

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM