機械設備裝配與自動控制,Spring IoC、DI、Bean和自動裝配的理解

 2023-10-06 阅读 27 评论 0

摘要:文章目錄IoC創建對象DI依賴注入Bean的理解自動裝配 IoC創建對象 我們都知道IoC是控制反轉的,也就是我們只需要把類注冊到Spring容器中,他可以幫助我們創建對象,該創建的思想也就是走的構造器 通過XML 例如我們創建一個People對象,默認有一個無參

文章目錄

  • IoC創建對象
  • DI依賴注入
  • Bean的理解
  • 自動裝配

IoC創建對象

我們都知道IoC是控制反轉的,也就是我們只需要把類注冊到Spring容器中,他可以幫助我們創建對象,該創建的思想也就是走的構造器
通過XML
例如我們創建一個People對象,默認有一個無參構造

package com.hzy.pojo;
public class People {
}

然后我們通過XML將該類注冊到Spring中,這樣他就是一個bean了,并且被Spring管理
<bean id="people" class="com.hzy.pojo.People"/>
我們進行創建對象的時候,不用new了,而是在Spring容器中拿

ApplicationContext context2 = new ClassPathXmlApplicationContext("applicationContext.xml");
People people = context2.getBean("people", People.class);

通過注解
在用注解之前,我們需要先打開注解的支持和注解要掃描的包

<!--    開啟注解支持-->
<context:annotation-config/>
<!--    配置要掃描的包下的注解生效-->
<context:component-scan base-package="com.hzy.pojo"/>

機械設備裝配與自動控制。然后創建類,通過@Component注入到Spring,與此作用一樣的還有@Service、@Controller、@Repository

package com.hzy.pojo;import org.springframework.stereotype.Component;@Component
public class People {
}

獲取的時候同樣

ApplicationContext context2 = new ClassPathXmlApplicationContext("applicationContext.xml");
People people = context2.getBean("people", People.class);
System.out.println(people);

通過完全注解
首先我們需要創建一個配置類AppConfig,名字可以隨便取,在這個配置類中,就把要注入Spring中的類當作一個bean了

package com.hzy.config;import com.hzy.pojo.People;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class AppConfig {@Beanpublic People people() {return new People();}
}

然后就只需要創建一個類,這里不用@Component注解了,因為在配置類中已經指定類了。

package com.hzy.pojo;public class People {
}

最后測試的時候用AnnotationConfigApplicationContext

ApplicationContext context2 = new AnnotationConfigApplicationContext(AppConfig.class);
People people = context2.getBean("people", People.class);

DI依賴注入

依賴注入這里主要講解set注入和構造器注入
set注入
在我們進行XML創建對象的時候,我們可以通過property標簽進行值得注入
首先我們創建一個普通的實體類

package com.hzy.pojo;public class Student {private String name;private int age;// get set tostring 省略
}

jdbctemplate連接池,然后在XML中進行配置即可

<bean id="student" class="com.hzy.pojo.Student"><property name="name" value="張三"/><property name="age" value="18"/>
</bean>

另外,我們還可以通過p(property)命名空間
<bean id="student" class="com.hzy.pojo.Student" p:name="張三" p:age="18"/>
記得引入一個頭文件
xmlns:p="http://www.springframework.org/schema/p"
另外我們還可以通過注解進行注入
首先在XML中開啟注解并配置要掃描的包

<!--    開啟注解支持-->
<context:annotation-config/>
<!--    配置要掃描的包下的注解生效-->
<context:component-scan base-package="com.hzy.pojo"/>

注解可以寫到屬性上,也可以寫到set方法上

package com.hzy.pojo;import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;@Component
public class Student {@Value("張三")private String name;@Value("18")private int age;// 省略get set toString
}

我們還可以通過無配置文件注入,也就是先創建一個配置類,可以通過@ComponentScan配置要掃描的包,不配默認全部掃描

package com.hzy.config;import com.hzy.pojo.Student;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;@Configuration
@ComponentScan(basePackages = {"com.hzy.pojo"})
public class AppConfig {@Beanpublic Student student() {return new Student();}
}

構造器注入
構造器注入需要我們提供一個有參構造方法

package com.hzy.pojo;import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;public class Teacher {private String name;private Integer age;public Teacher(String name, Integer age) {this.name = name;this.age = age;}@Overridepublic String toString() {return "Teacher{" +"name='" + name + '\'' +", age=" + age +'}';}
}

在配置文件中通過constructor-arg屬性注入值

<bean id="teacher" class="com.hzy.pojo.Teacher"><constructor-arg name="name" value="張三"/><constructor-arg name="age" value="18"/>
</bean>

裝配。或者通過c(constructor-arg)命名空間
<bean id="teacher" class="com.hzy.pojo.Teacher" c:name="張三" c:age="18"/>

Bean的理解

首先說Bean的作用域,常用的有singleton單例,prototype原型,也就是多例
<bean id="teacher" class="com.hzy.pojo.Teacher" scope="singleton"/>
<bean id="teacher" class="com.hzy.pojo.Teacher" scope="prototype"/>
如果有線程安全問題,用prototype
另外就是關于Bean的生命周期,一共可以分為七步
1、構造器構造實例
2、注入值
3、初始化之前執行后置處理器的before方法,即實現BeanPostProcesser
4、初始化init-method
5、初始化之后執行后置處理器的after方法,即實現BeanPostProcesser
6、可以使用
7、銷毀destory-method

自動裝配

我們可以在配置文件中配置
<bean id="teacher" class="com.hzy.pojo.Teacher" autowire="byType"/>
<bean id="teacher" class="com.hzy.pojo.Teacher" autowire="byName"/>
但是我們一般都是用注解
@Autowired 默認是byType,可以通過@Qualifile為byName
@Resource 默認是byName,找不到自動byType
舉例:我們頭通過自動裝配在service層注入dao
首先在配置文件中開啟注解的支持和要掃描的包,這里也可以通過配置類

<!--    開啟注解支持-->
<context:annotation-config/>
<!--    配置要掃描的包下的注解生效-->
<context:component-scan base-package="com.hzy"/>

首先我們寫一個UserDao接口

package com.hzy.dao;public interface UserDao {public void add();
}

然后寫一個實現類,該類通過@Repository注入到Spring中

package com.hzy.dao;import org.springframework.stereotype.Repository;@Repository
public class UserDaoImpl implements UserDao {public void add() {System.out.println("add ...");}
}

然后就是業務層@Service,調用dao層,此處自動裝配的UserDao

package com.hzy.service;import com.hzy.dao.UserDao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;@Service
public class UserService {@Autowiredprivate UserDao userDao;public void add() {userDao.add();}
}

自動裝配線、最后測試

public class MyTest {@Testpublic void myTest() {ApplicationContext context1 = new ClassPathXmlApplicationContext("applicationContext.xml");UserService userService = context1.getBean("userService", UserService.class);userService.add();}
}

在這里插入圖片描述
如果我們在UserDaoImpl指定name的名字,然后并且用@AutoWired裝配

@Repository("abc")
public class UserDaoImpl implements UserDao {public void add() {System.out.println("add ...");}
}
@Service
public class UserService {@Autowired@Qualifier("abc") //與上面的對應private UserDao userDao;public void add() {userDao.add();}}

同時我們也可以通過@Resource

@Service
public class UserService {//    @Autowired
//    @Qualifier("abc")@Resource(name = "abc")private UserDao userDao;public void add() {userDao.add();}}

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://hbdhgg.com/2/122855.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 匯編語言學習筆記 Inc. 保留所有权利。

底部版权信息