目錄
- 3、IOC創建物件的方法
- 4、Spring配置
- 4.1、別名
- 4.2、Bean的配置
- 4.3、import
- 5、依賴注入
- 5.1、構造器注入
- 5.2、Set方式注入【重點】
- 5.3、擴展方式注入
- 5.4、bean的作用域
- 6、Bean的自動配置
- 6.1、測驗
- 6.2、ByName自動裝配
- 6.3、ByType自動裝配
- 6.4、使用注解實作自動裝配
- 7、使用注解開發
- 8、使用Java的方式配置Spring
3、IOC創建物件的方法
-
使用無參構造創建物件,默認!
-
使用有參構造創建物件
- 下標賦值
<!--第一種 下標賦值--> <bean id="user" > <constructor-arg index="0" value="https://www.cnblogs.com/zhongjianYuan/archive/2023/03/11/鐘健"/> </bean>-
型別創建
<!--第二種 通過型別創建 不建議使用--> <bean id="user" > <constructor-arg type="java.lang.String" value="https://www.cnblogs.com/zhongjianYuan/archive/2023/03/11/zhongjian"/> </bean> -
引數名
<!-- 第三種 直接通過引數名來設定--> <bean id="user" > <constructor-arg name="name" value="https://www.cnblogs.com/zhongjianYuan/archive/2023/03/11/Jan"/> </bean>
總結:在組態檔加載的時候,容器中的管理的物件就已經初始化了!
4、Spring配置
4.1、別名
<!--別名,如果添加了別名,我們也可以使用別名取到這個物件-->
<alias name="user" alias="userNew"/>
4.2、Bean的配置
<!--
id: bean 的唯一識別符號,也就是相當于我們學的物件名
class: bean 物件所對應的全限定名: 包名 + 型別
name: 也是別名, 而且name 可以同時取多個別名
-->
<bean id="userT" name="user2 u2,u3;u4">
<property name="name" value="https://www.cnblogs.com/zhongjianYuan/archive/2023/03/11/鐘健學習"/>
</bean>
4.3、import
-
這個import一般用于團隊開發使用,他可以將多個組態檔匯入合并為一個,假設,現在專案有對人開發,將三人不同的開類需注冊到不同的bean中,我們可以利用import將所有人的beans.xml合并為一個總的!
-
張三
-
李四
-
王五
-
applicationContext
<import resource="beans.xml"/> <import resource="beans2.xml"/> <import resource="beans3.xml"/>
5、依賴注入
5.1、構造器注入
- 依賴注入:
- 依賴:bean物件的創建依賴于容器!
- 注入: bean物件中的所有屬性,由容器注入!
【環境搭建】
-
復雜型別
public class Address { private String address; public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } } -
真實測驗物件
public class Student { private String name; private Address address; private String[] books; private List<String>hobbys; private Map<String,String> card; private Set<String> games; private String wife; private Properties info; } -
beans.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" xsi:schemaLocation="http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="student" > <!--第一種,普通注入,value--> <property name="name" value="https://www.cnblogs.com/zhongjianYuan/archive/2023/03/11/鐘健"/> </bean> </beans> -
測驗類
public class MyTest { public static void main(String[] args) { ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml"); Student student = (Student) context.getBean("student"); System.out.println(student.getName()); } } -
完善注入資訊
<?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 https://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="address" > <property name="address" value="https://www.cnblogs.com/zhongjianYuan/archive/2023/03/11/北京"/> </bean> <bean id="student" > <!--第一種,普通注入,value--> <property name="name" value="https://www.cnblogs.com/zhongjianYuan/archive/2023/03/11/鐘健"/> <!--第二種,bean注入,ref--> <property name="address" ref="address"/> <!--陣列注入--> <property name="books"> <array> <value>紅樓夢</value> <value>水滸傳</value> <value>三國演義</value> <value>西游記</value> </array> </property> <!--List--> <property name="hobbys"> <list> <value>聽歌</value> <value>敲代碼</value> <value>看電影</value> </list> </property> <!--Map--> <property name="card"> <map> <entry key="身份證" value="https://www.cnblogs.com/zhongjianYuan/archive/2023/03/11/111111222222223333"/> <entry key="銀行卡" value="https://www.cnblogs.com/zhongjianYuan/archive/2023/03/11/123456789"/> </map> </property> <!--Set--> <property name="games"> <set> <value>LOL</value> <value>COS</value> </set> </property> <!--null--> <property name="wife"> <null/> </property> <!--Properties--> <property name="info"> <props> <prop key="driver">20230102</prop> <prop key="url">男</prop> <prop key="username">root</prop> <prop key="password">123456</prop> </props> </property> </bean> </beans>
5.2、Set方式注入【重點】
5.3、擴展方式注入
我們可以使用P命名空間和C 命名空間進行注入
-
官方解釋
-
使用
<?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:p="http://www.springframework.org/schema/p" xmlns:c="http://www.springframework.org/schema/c" xsi:schemaLocation="http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd"> <!-- P命名空間注入,可以直接注入屬性的值 property--> <bean id="user" p:name="鐘健" p:age="18"/> <!-- c命名空間注入,通過構造器注入 construct-args--> <!--在User類中要有無參和有參構造器才可以使用 C 命名注入--> <bean id="user2" c:age="18" c:name="Jan"/> </beans> -
測驗
@Test public void test2(){ ApplicationContext context = new ClassPathXmlApplicationContext("userbeans.xml"); //User user = context.getBean("user", User.class); User user = context.getBean("user2", User.class); System.out.println(user); }
注意點: P 命名和 C 命名空間不能直接使用,需要匯入xml約束!
- P命名注入
xmlns:p="http://www.springframework.org/schema/p"
- C命名注入
xmlns:c="http://www.springframework.org/schema/c"
5.4、bean的作用域
-
單例模式(Spring默認機制)--->30分鐘的教學記得看
- 有時候并發情況下會產生延遲或資料不一致,單執行緒一般用這個
<bean id="user2" c:age="18" c:name="Jan" scope="singleton"/> -
原型模式:每次從容器中get的時候,都會產生一個新物件!
<bean id="user2" c:age="18" c:name="Jan" scope="prototype"/>- 別特浪費資源,多執行緒可以使用原型模式
-
其余的request、session、application,這些個只能在web開發中使用的!
6、Bean的自動配置
- 自動配置是Spring滿足bean依賴的一種方式
- Spring會在背景關系中自動尋找,并自動給bean裝配屬性!
在spring的三種配置方式:
- 在xml中顯示的配置
- 在java中顯示的配置
- 隱式 的自動裝配bean【重要】
6.1、測驗
環境搭建:一個人有兩個寵物!
- 原來的xml配置
<bean id="cat" />
<bean id="dog" />
<bean id="people" >
<property name="name" value="https://www.cnblogs.com/zhongjianYuan/archive/2023/03/11/鐘健"/>
<property name="cat" ref="cat"/>
<property name="dog" ref="dog"/>
</bean>
6.2、ByName自動裝配
<bean id="cat" />
<bean id="dog" />
<!--
ByName: 會自動在容器背景關系中查找,和自己物件set方法后面的值對應的 bean id!
ByType: 會自動在容器背景關系中查找,和自己物件屬性型別相同的 bean !
-->
<bean id="people" autowire="byName">
<property name="name" value="https://www.cnblogs.com/zhongjianYuan/archive/2023/03/11/鐘健"/>
</bean>
6.3、ByType自動裝配
<bean />
<bean />
<!--
ByName: 會自動在容器背景關系中查找,和自己物件set方法后面的值對應的 bean id!
ByType: 會自動在容器背景關系中查找,和自己物件屬性型別相同的 bean !
-->
<bean id="people" autowire="byType">
<property name="name" value="https://www.cnblogs.com/zhongjianYuan/archive/2023/03/11/鐘健"/>
</bean>
小結:
- byname的時候,需要保證所有的bean的id唯一,并且這個bean需要和自動注入的屬性的set方法的值一致!
- bytype的時候,需要保證所有的bean的class唯一,并且這個bean需要和自動注入的屬性的型別一致!
6.4、使用注解實作自動裝配
jdk1.5支持的注解,Spring2.5就支持注解了!
The introduction of annotation-based configuration raised the question of whether this approach is “better” than XML.
要使用注解須知:
- 匯入約束,context約束
- 配置注解支持: context:annotation-config/【重點】
<?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/beans
https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
https://www.springframework.org/schema/context/spring-context.xsd">
<context:annotation-config/>
</beans>
@Autowired
直接在屬性上使用即可!也可以在set方式上使用!
使用Autowired 我們可以不用撰寫Set方法了,前提式你這個自動裝配的屬性在IOC(Spring)容器中存在,且符合名字byname!
科普:
@Nullable 欄位標記了這個注解,說明了這個欄位可以為null;
public People(@Nullable String name) {
this.name = name;
}
public @interface Autowired {
boolean required() default true;
}
測驗代碼
public class People {
//如果顯示定義了Aurowired的required的屬性為false,說明這個物件可以為null,否則不允許為空!
@Autowired(required = false)
private Cat cat;
@Autowired
private Dog dog;
private String name;
}
如果 @Autowired 自動裝配的環境比較復雜,自動裝配無法通過一個注解【@Autowired】完成的時候,我們可以誰用@Qualifier(value =https://www.cnblogs.com/zhongjianYuan/archive/2023/03/11/="xxx")去配置@Autowired的使用,指定一個唯一的bean物件注入!
public class People {
@Autowired
@Qualifier(value = "https://www.cnblogs.com/zhongjianYuan/archive/2023/03/11/cat222")
private Cat cat;
@Autowired
@Qualifier(value = "https://www.cnblogs.com/zhongjianYuan/archive/2023/03/11/dog222")
private Dog dog;
private String name;
}
xml的代碼
<bean id="cat222" />
<bean id="cat111" />
<bean id="dog222" />
<bean id="dog111" />
<bean id="people" />
@Resource注解
public class People {
@Resource(name = "cat2")
private Cat cat;
@Resource
private Dog dog;
}
小結:
@Autowired和@Resource的區別:
- 都是用來自動裝配的,都可以放在屬性欄位上
- @Autowired 通過 byType 的方式實作,而且必須要求這個物件存在!【常用】
- @Resource 默認通過 byName的方式實作的,如果找不到名字,則通過byType實作!(名字 屬性)如果兩個都找不到的情況下,就報錯!【常用】
- 執行順序不同: @Autowired 通過 byType 的方式實作,@Resource 通過 byName的方式實作的,
7、使用注解開發
在Spring4之后,要使用注解開發,必須要保證aop包的注入!
使用注解需要匯入context約束,增加注解的支持!
<?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/beans
https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
https://www.springframework.org/schema/context/spring-context.xsd">
<context:annotation-config/>
</beans>
-
bean
-
屬性如何注入
//等價于 <bean id="user" /> //@Component 組件 @Component public class User { public String name ; //相當于 <property name="name" value="https://www.cnblogs.com/zhongjianYuan/archive/2023/03/11/zhongjian"/> @Value("zhongjian") public void setName(String name) { this.name = name; } } -
衍生的注解
@Component有幾個衍生注解,我們在web開發中,會按照mvc三層架構分層!
-
dao 【@Repository】
-
service 【@Service】
-
controller 【@Controller】
這四個注解功能都是一樣的,都是代表將某個類注冊到Spring中,裝配Bean,
-
-
自動裝配置
- @Autowired:自動裝配,通過屬性,名字 如果Autowired不能唯一自動裝配上屬性,則需要通過@Qualifier(value =https://www.cnblogs.com/zhongjianYuan/archive/2023/03/11/="xxx") - @Nullable 欄位標記了這個注解,說明了這個欄位可以為null; - @Resource:自動裝配,通過名字,屬性 -
作用域
@Scope("prototype") @Scope("singleton")@Component @Scope("prototype") public class User { public String name ; //相當于 <property name="name" value="https://www.cnblogs.com/zhongjianYuan/archive/2023/03/11/zhongjian"/> @Value("zhongjian") public void setName(String name) { this.name = name; } } -
小結
xml與注解:
- xml:更加萬能,適用于任何場合!維護簡單方便
- 注解:不是注解類使用不了,維護相對復雜
xml與注解最佳實踐:
-
xml用來管理bean;
-
注解只負責完成屬性的注入;、
-
我們在使用的程序中,只需要注意一個問題:必須讓注解生效,就需要開啟注解的支持
<!-- 指定要掃描的包,這個包下的注解就會生效 --> <context:component-scan base-package="com.jan.pojo"/> <context:annotation-config/>
8、使用Java的方式配置Spring
我們現在要完全不適用Spring 的 xml 配置了,全權交給Java來做!
JavaConfig 是 Spring 的一個字專案,在 Spring 4之后, 它成為了一個核心功能!
物體類
package com.jan.pojo;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
//這個注解的意思,就是說明這個類被Spring接管了,注冊到了容器中
@Component
public class User {
private String name;
public String getName() {
return name;
}
@Value("ZHONGJIAN") //屬性注入值
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
'}';
}
}
組態檔
package com.jan.config;
import com.jan.pojo.User;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
//這個也是Spring容器托管,注冊到容器中,因為它本來就是一個@Component
//@Configuration代表這是一個配置類,就和 我們之前看到的beans.xml
@Configuration
@ComponentScan("com.jan.pojo")
@Import(JanConfig2.class)
public class JanConfig {
//注冊一個Bean,就相當于我們之前寫的一個bean標簽
//這個方法的名字(eg:user),就相當于bean標簽中的id屬性
//這個方法的回傳值(eg:User),就相當于bean標簽中的class屬性
@Bean
public User user(){
return new User(); // 就是回傳要注入到bean的物件!
}
}
測驗類
public class MyTest {
public static void main(String[] args) {
//如果完全使用了配置類的方式去做,我們就只能通過 AnnotationConfig 背景關系來獲取容器,通過配置類的class物件加載!
ApplicationContext context = new AnnotationConfigApplicationContext(JanConfig.class);
User getUser = context.getBean("user", User.class);
System.out.println(getUser.getName());
}
}
這種純Java的配置方式,在SpringBoot中隨處可見!
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/546534.html
標籤:其他
上一篇:java的資料和運算式
下一篇:Python 中連接MSSQL,MySQL,SQLite,Redis,ElasticSearch,Mongodb,PostgreSQL,Oracle,RabbitMQ
