Spring的出現是為了解決企業應用程式開發的復雜性 它是一個分層的、JavaSE/EE一站式、輕量級開源框架,
Spring框架是一個分層架構,它包含一系列的功能要素并被分為大約20個模塊,這些模塊分為Core Container、Data Access/Integration、Web、AOP(Aspect Oriented Programming)、Instrumentation和測驗部分,
spring的兩個核心是 ioc 和 aop;
IoC(Inversion of Control 控制反轉):將物件創建的權利交給spring工廠來控制,
AOP(Aspect Oriented Programming 面向切面編程),基于動態代理的功能增強方式,
本章主要學習下ioc的內容;
第一步 : 創建工程匯入jar 包,
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.example</groupId>
<artifactId>springTest</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.0.5.RELEASE</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.16</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.6.1</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
spring 有4個核心容器的jar 包 分別是Beans、Core、Context、SpEL這里我們只要引入spring-context依賴就足夠了,

添加log4j.properties檔案放置到src/reources下,
log4j.rootLogger=INFO,A1
log4j.logger.org.apache=INFO
log4j.appender.A1.Target=System.err
log4j.appender.A1=org.apache.log4j.ConsoleAppender
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss,SSS} [%t] [%c]-[%p] %m%n
ps:這里的日志等級可以改為debug的級別,這里為了簡便設定為info的級別,有需要可以自行更改,
接下來就是寫下的偽登錄業務;
快速寫下dao層和service層業務
package com.spring.quickTest;
public interface userDao {
public void queryUser();
}
package com.spring.quickTest;
public class UserDaoImpl implements userDao {
@Override
public void queryUser() {
System.out.println("用戶登錄了");
}
}
package com.spring.quickTest;
public interface UserService {
void login();
}
package com.spring.quickTest;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class UserServiceImpl implements UserService {
private userDao userDao;
public void setUserDao(com.spring.quickTest.userDao userDao) {
this.userDao = userDao;
}
@Override
public void login() {
System.out.println("準備登錄中");
// 1.傳統方法
// userDao userDao = new UserDaoImpl();
// userDao.queryUser();
// 2.自定義工廠
// userDao user = (userDao) new UserdaoFactory().getBean();
// user.queryUser();
// 3spring 工廠
// ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
// userDao userDao = (com.spring.quickTest.userDao) context.getBean("userDao");
userDao.queryUser();
}
}
傳統方法下的代碼過于耦合;
例如:UserDao userDao = new UserDaoImpl();
如果要更換實作類,或者實作類換一個名字,此時代碼會報錯,必須要修改原來的業務代碼,
我們也可以通過反射的方法自定義一個bean工廠來實作代碼的解耦;
package com.spring.quickTest;
public class UserdaoFactory {
public Object getBean() {
try {
return Class.forName("com.spring.quickTest.UserDaoImpl").newInstance();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
return null ;
}
}
我們就可以通過自定義的工廠進行實體化,然后呼叫dao層的方法,避免了耦合,
接下來也可以通過spring的工廠來實作解耦;
寫好spring核心檔案的組態檔applicationContext.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 http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean name="userDao" class="com.spring.quickTest.UserDaoImpl"/>
<bean name="UserService" class="com.spring.quickTest.UserServiceImpl">
<property name="userDao" ref="userDao"></property>
</bean>
</beans>
我們將dao層交給spring 工廠后發現還是不夠方便,就將service層也交給spring工廠來控制 ,將bean標簽下的 property進行依賴注入這樣我們只要宣告下成員變數后并進行set方法賦值就可以直接參考了,不需要在創建spring工廠了,

ps:
標簽說明: bean: spring工廠創建的一個物件(反射機制)
id/name:物件的名字,可以用來參考或者獲取物件, 一般為類名或介面名稱的首字母小寫
class:要創建的物件型別的類字串,類名全路徑
注入物件
property 根據類中的setter方法進行屬性注入
name:setter方法的后綴小寫,比如setXxx 對應的name為xxx
ref:參考哪一個bean(物件),值為bean的id/name
import com.spring.quickTest.UserServiceImpl;
import com.spring.quickTest.UserService;
import com.spring.quickTest.UserdaoFactory;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class userTest {
@Test
public void test(){
// UserService service = new UserServiceImpl();
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
UserService service = (UserService) context.getBean("UserService");
service.login();
}
}
創建完測驗類后運行成功,,,

轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/261362.html
標籤:其他
