spring框架文档学习(包会)
文章目錄
- spring簡介
- IOC控制反轉
- ioc概念
- ioc使用
- (1)導入依賴
- (2)編寫實體類
- (3)編寫配置文件
- (3)創建容器從容器中獲取對象并測試
- ioc三種創建對象方式
- (1)下標賦值
- (2)類型創建
- (3)參數名
- DI依賴注入
- 構造器注入
- Set方法注入
- (c,p)命名注入
- bean的作用域
- bean的自動裝配
- ByName自動裝配
- ByType自動裝配
- 使用注解實現自動裝配
- Spring注解開發
- 脫離spring的xml配置,純注解開發
- AOP底層:代理模式
- 靜態代理
- 動態代理
- Aop概念
- Spring實現Aop
- 使用Spring的API接口
- 自定義來實現AOP
- 注解實現AOP
spring簡介
spring是一個輕量級開源框架,是為了解決企業應用程序開發復雜性創建的
spring目前是JavaEE開發的靈魂框架。他可以簡化JavaEE開發,可以非常方便整合其他框架,無侵入的進行功能增強。
spring的核心是控制反轉(IOC)和面向切面(AOP)。
IOC控制反轉
ioc概念
spring ioc控制反轉,對象之間的依賴交給sping來進行管理,避免了強耦合;
ioc使用
(1)導入依賴
導入SpringIOC相關依賴
<dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.3.6</version></dependency>(2)編寫實體類
路徑自己建立
public class User {private String name;public User() {}public User(String name) {this.name = name;}public String getName() {return name;}public void setName(String name) {this.name = name;}@Overridepublic String toString() {return "User{" +"name='" + name + '\'' +'}';} }(3)編寫配置文件
在resources目錄下創建applicationContext.xml文件,文件名可以任意取。但是建議叫applicationContext。
內容如下:
<?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"><!--classs:配置類的全類名id:配置一個唯一標識property 相當于給對象中的屬性設置一個值!--><bean id="user" class="com.guohui.pojo.User"><property name="name" value="國輝"/></bean></beans>(3)創建容器從容器中獲取對象并測試
public class MyTest {public static void main(String[] args) {//創建對象ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");//獲取對象User user = (User) context.getBean("user");System.out.println(user);} }ioc三種創建對象方式
····使用無參構造創建對象,默認!
····假設我們要使用有參構造創建對象。
(1)下標賦值
<!--第一種方式:下標賦值 --><bean id="user" class="com.guohui.pojo.User"><constructor-arg index="0" value="國輝"/></bean>(2)類型創建
<!--第二種方式:通過類型的創建,不建議使用 --><bean id="user" class="com.guohui.pojo.User"><constructor-arg type="java.lang.String" value="guohui"/></bean>(3)參數名
<!--第三種方式:直接通過參數名來設置 --><bean id="user" class="com.guohui.pojo.User"><constructor-arg name="name" value="國輝"/></bean>總結:在配置文件加載的時候,容器中管理的對象就已經初始化了!
DI依賴注入
構造器注入
使用有參構造進行注入
<bean id="user" class="com.guohui.pojo.User"><constructor-arg type="java.lang.String" value="guohui"/></bean>Set方法注入
依賴:bean對象的創建依賴于容器!
注入:bean對象中的所有屬性,由注入器來注入
(c,p)命名注入
注意點:p命名和c命名空間不能直接使用,需要導入xml約束!
xmlns:p="http://www.springframework.org/schema/p"xmlns:c="http://www.springframework.org/schema/c"了解就行了,不推薦使用!
bean的作用域
單例模式(Spring默認機制)scope=“singleton”
原型模式:每次從容器中get的時候,都會產生一個新對象!scope=“prototype”
其余的request、session、application、這些只能在web開發中使用到!
bean的自動裝配
自動裝配是spring滿足bean依賴的一種方式!
Spring會在上下文中自動尋找,并自動給bean裝配屬性!
在Spring中有三種裝配的方式:
ByName的時候,需要保證所有bean的id唯一,并且這個bean需要和自動注入的屬性的set方法的值一致!
ByType的時候,需要保證所有bean的class唯一,并且這個bean需要和自動注入的屬性的類型一致!
ByName自動裝配
<!--byName:會自動在容器上下文中查找,和自己對象set方法后面的值對應的bean id!--> <bean id="people" class="com.kuang.pojo.People" autowire="byName"><property name="name" value="小白蓮"/> </bean>ByType自動裝配
<!--byType:會自動在容器上下文中查找,和自己對象屬性類型相同的bean!--><bean id="people" class="com.kuang.pojo.People" autowire="byType"><property name="name" value="小白蓮"/></bean>使用注解實現自動裝配
@Autowired注解
注解開發準備工作
? 如果要使用注解開發必須要開啟組件掃描,這樣加了注解的類才會被識別出來。Spring才能去解析其中的注解。
@Autowired注解
直接在屬性上使用即可!
Spring注解開發
bean
@Component//相當于 <bean id ="user" class="com.guohui.dao.User"/>public class User {//相當于 <property name="name" value="guohui"/>@Value("guohui")public String name;//相當于 <property name="name" value="666666"/>@Value("666666")public String pwd;}衍生的注解
@Component有幾個衍生注解,我們在web開發中,會按照mvc三層架構分層!
自動裝配
- @Autowired:自動裝配通過類型,名字。如果Autowired不能唯一自動裝配上屬性,則需要通過@Qualifier(value = "xxx")去配置。 - @Nullable 字段標記了了這個注解,說明這個字段可以為null; - @Resource:自動裝配通過名字,類型。脫離spring的xml配置,純注解開發
@Component public class User {private String name;@Value("純注解")public void setName(String name) {this.name = name;}public User() {}@Overridepublic String toString() {return "User{" +"name='" + name + '\'' +'}';}public String getName() {return name;}public User(String name) {this.name = name;} }配置文件applicationContext.xml
// 這個也會Spring容器托管,注冊到容器中,因為它本來就是一個@Component // @Configuration代表這是一個配置類,就和我們之前看的applicationContext.xml文件 @Configuration @ComponentScan("com.guohui.pojo")//啟動注解掃描 @Import(GuoConfig.class)//引入多個@Configuration相當于引入多個applicationContext.xml文件 public class GuoConfig {//注冊一個bean。相當于applicationContext.xml文件里的bean標簽//這個方法的名字就是bean中的id屬性//這個方法返回的值相當于,bean標簽中的class屬性@Beanpublic User getUser(){return new User();} }測試類
public class demo {public static void main(String[] args) {//如果完全使用了配置類方式去做,我們就只能通過 AnnotationConfig 上下文來獲取容器,通過配置類的class對象加載!AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(GuoConfig.class);User getUser = (User) context.getBean("getUser");System.out.println(getUser.getName());} }AOP底層:代理模式
靜態代理
角色分析:
抽象角色:一般使用接口或者抽象類來解決
真實角色:被代理的角色
代理角色:代理真實角色,代理真實角色后,我們一般會做一些附屬操作
客戶:訪問代理對象的人!
代碼案例
想戀愛的男孩
女人
//女人----要戀愛 public class girl implements like{@Overridepublic void like() {System.out.println("女孩要戀愛!!!");} }成雙結對-戀愛
//戀愛-在一起 public interface like {public void like(); }媒人-(代理模式)
//媒人 public class Proxy implements like {private girl girl;public Proxy() {}public com.guohui.demo_01.girl getGirl() {return girl;}public void setGirl(com.guohui.demo_01.girl girl) {this.girl = girl;}@Overridepublic void like() {System.out.println("幫女孩戀愛");}public void a() {System.out.println("收中介費用");}public void b() {System.out.println("吃席");} }代理模式的好處:
1、代理模式能將代理對象與真實被調用的目標對象分離。 2、一定程度上降低了系統的耦合度,擴展性好。 3、可以起到保護目標對象的作用。 4、可以對目標對象的功能增強。代理模式的壞處:
1、代理模式會造成系統設計中類的數量增加。2、在客戶端和目標對象增加一個代理對象,會造成請求處理速度變慢。3、增加了系統的復雜度。動態代理
動態代理底層是反射
動態代理和靜態代理角色一樣
動態代理的代理類是動態生成的,不是我們直接寫好的!
動態代理分為兩大類:基于接口的動態代理,基于類的動態代理
動態代理基于接口:jdk動態代理
需要了解兩個類:Proxy:代理;InvocationHandler:調用處理程序。
動態代理的好處:
可以使真實角色的操作更加純粹!不用去關注一些公共的業務 公共角色就交給代理角色!實現了業務的分工! 公共業務發生擴展的時候,方便集中管理!
一個動態代理類代理的是一個接口,一般就是對應的一類業務 一個動態代理類可以代理多個類,只要是實現了同一個接口即可!
Aop概念
Spring 面向切面編程(Aop)
面向切面的編程,或AOP, 是一種編程技術,對業務邏輯中的各個部分切割隔離,使耦合度降到最低,不僅增加了開發效率,還增強了系統的重用性和可維護性。
Spring實現Aop
使用AOP織入,需要導入一個依賴包
<dependency><groupId>org.aspectj</groupId><artifactId>aspectjweaver</artifactId><version>1.9.6</version></dependency>使用Spring的API接口
使用注解簡單
自定義來實現AOP
使用注解簡單
注解實現AOP
使用AOP織入,需要導入一個依賴包!
<dependency><groupId>org.aspectj</groupId><artifactId>aspectjweaver</artifactId><version>1.9.6</version></dependency>在service包下,定義UserService業務接口
public interface UserService {void a();void b();void c();void d(); }UserServiceImpl實現類
public class UserServiceImpl implements UserService{@Overridepublic void a() {System.out.println("a方法");}@Overridepublic void b() {System.out.println("b方法");}@Overridepublic void c() {System.out.println("c方法");}@Overridepublic void d() {System.out.println("d方法");} }在diy包下定義注解實現的AnnotationPointCut增強類
//聲明式事務! @Aspect//標注這個類是一個切面 public class Anoot { @Before("execution(* com.guohui.service.UserServiceImpl.*(..))")//切入點public void beforeo() {System.out.println("=====方法執行前-切入- =====");}@After("execution(* com.guohui.service.UserServiceImpl.*(..))")//切入點public void after() {System.out.println("====方法執行后-切入- ====");}}在Spring配置文件中,注冊bean,并增加支持注解的配置。
<?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:aop="http://www.springframework.org/schema/aop"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/aophttp://www.springframework.org/schema/aop/spring-aop.xsd "><!--配置bean--><bean id="userservice" class="com.guohui.service.UserServiceImpl"/><bean id="log" class="com.guohui.log.Log"/><bean id="afterLog" class="com.guohui.log.AfterLog"/><!--配置aop:需要導入aop約束--><bean id="anno" class="com.guohui.diy.Anoot"/><aop:aspectj-autoproxy/> </beans>測試
public class demo {public static void main(String[] args) {ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");UserService userService = (UserService) context.getBean("userservice");userService.a();} }看到此文檔的人,希望這篇文檔能給你們帶來價值!!!
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的spring框架文档学习(包会)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Redis(5种数据类型)
- 下一篇: maven静态资源导出(Ctrl+C+V