宇宙大爆炸會不會重複發生
Spring5
1.前身:interface21
2.發明者:Rod Johnson(悉尼大學 雙學位 音樂學 計算機學)
3.輕量級、防入侵
4.優點:輕量級的控制反轉(IOC)和麵向切面程式設計(AOP)
5.Spring框架主要由七部分組成,分別是Spring Core、 Spring AOP、 Spring ORM、 Spring DAO、Spring Context、 Spring Web和 Spring Web MVC
6.弊端:“配置地獄”
一、作用域(scope)
二、動態代理
-
動態代理和靜態代理角色一樣
-
動態代理的代理類是動態生成的,不是我們直接寫好的!
-
動態代理分為兩大類:基於介面的動態代理,基於類的動態代理
-
基於介面---JDK動態代理
-
基於類:cglib
-
java位元組碼實現:javasist(東京工業大學的數學和計算機科學系的 Shigeru Chiba (千葉 滋)所建立的。它已加入了開放原始碼JBoss 應用伺服器專案,通過使用Javassist對位元組碼操作為JBoss實現動態"AOP"框架。)
兩個類:Proxy:代理,InvocationHandler:呼叫處理程式並返回結果(呼叫處理程式)
-
三、依賴
<dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>5.2.0.RELEASE</version> </dependency> </dependencies>
四、建立程式
-
匯入依賴,建立Model專案
-
建立實體類
-
配置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="..." class="..."> <!-- collaborators and configuration for this bean go here --> </bean> <bean id="..." class="..."> <!-- collaborators and configuration for this bean go here --> </bean> <!-- more bean definitions go here --> </beans>
-
建立測試類
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("xml檔名"); 類名 bean = context.getBean("id名",強轉類); System.out.println(bean.toString());
五、注入物件
-
在Xml檔案中建立
<bean id="one" class="com.dragon.pojo.Hello"> <property name="name" value="first spring"/> </bean> <bean id="two" class="com.dragon.pojo.Hello"> <property name="hello" ref="one"/> </bean>
六、註解方式IOC/DI
- IOC---控制反轉
- DI---依賴注入
七、自動裝配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" xsi:schemaLocation="http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="cat" class="com.dragon.Catt"/> <bean id="dog" class="com.dragon.Dog"/> <bean id="three" class="com.dragon.Person"> <property name="name" value="Dawson"/> <property name="cat" ref="one"/> <property name="dog" ref="two"/> </bean> </beans>
-
Java裝配
-
隱式裝配
- byName
<?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="cat" class="com.dragon.Catt"/> <bean id="dog" class="com.dragon.Dog"/> <bean id="three" class="com.dragon.Person" autowire="byName"> <property name="name" value="Dawson"/> <!-- <property name="cat" ref="one"/> <property name="dog" ref="two"/> --> </bean> </beans>
byName會自動在容器上下文中找與set後的名稱對應的beanId
- byType
<?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="cat" class="com.dragon.Catt"/> <bean id="dog" class="com.dragon.Dog"/> <bean id="three" class="com.dragon.Person" autowire="byType"> <property name="name" value="Dawson"/> <!-- <property name="cat" ref="one"/> <property name="dog" ref="two"/> --> </bean> </beans>
byType會自動在容器上下文中找與自己物件屬性型別相同的類與之對應
八、註解實現自動裝配
jdk1.5支援註解,spring2.5支援註解
使用註解須知:
- 匯入約束: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/>
<bean id="person" class="com.dragon.Person"/>
<bean id="dog" class="com.dragon.Dog"/>
<bean id="cat" class="com.dragon.Cat"/>
</beans>
- @Autowired
- 可使用在屬性或set方法上
- 可以將set方法去除
- 當名字或型別有一個相同,則可以在xml檔案中更改id對應的值,反之不可以
- 如果有上述情況,則可以將@Autowired和@Qualifier(value="dog222")配合使用
- @Resource
- 和@Autowired性質差不多,但不可以用在set上
- 先找byName再byType,最後找不到就報錯
- 當然也可以傳參,例如@Resource(name="dog111")
- 小結
- 二者均是用來自動裝配的,都可以放在屬性欄位上
- @Autowired預設通過byType方式,如果有多個型別相同的再按照byName
- @Resouce預設通過byName方式,如果找不到名字,則通過byType實現,如果二者都找不到,就報錯
九、使用註解開發
在使用spring4之後,要使用註解開發,必須要保證AOP的包匯入了
-
建立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" 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:component-scan base-package="com.dragon.pojo"/> <context:annotation-config/> </beans>
-
在實體類中使用以下註解
-
@Component:註冊類到IOC容器
-
@Resource:javax的自動裝配
-
@Autowired:spring的自動裝配
-
@Value:給屬性賦值
-
@Qualifier :與@Autowired配合使用
-
十、AOP
AOP(Aspect Oriented Programming):面向切面程式設計,通過預編譯方式和執行期動態代理實現程式功能的統一維護。Aop是OOP的延續。是函數語言程式設計的一種衍生泛型。利用AOP可以對業務邏輯的各個部分進行隔離,從而使得業務邏輯各部分之間的耦合性降低,提高程式的可重用性,同時提高了開發效率。
注意,在pom.xml中匯入依賴
<dependencies>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.9.8</version>
</dependency>
</dependencies>
1.使用SpringAPI介面
-
建立介面
public interface UserService { public void add(); public void delete(); public void update(); public void select(); }
-
介面實現類
public class UserServiceImpl implements UserService{ @Override public void add() { System.out.println("增加了一個使用者"); } @Override public void delete() { System.out.println("刪除了一個使用者"); } @Override public void update() { System.out.println("更改了一個使用者"); } @Override public void select() { System.out.println("查找了一個使用者"); } }
-
建立日誌
- 執行之前
import org.springframework.aop.MethodBeforeAdvice; import java.lang.reflect.Method; public class Log implements MethodBeforeAdvice { //method:要執行的目標物件的方法 //args:引數 //target:目標物件 @Override public void before(Method method, Object[] args, Object target) throws Throwable { System.out.println(target.getClass().getName() + "的" + method.getName() + "被執行了"); } }
- 執行之後
import org.springframework.aop.AfterReturningAdvice; import java.lang.reflect.Method; public class AfterLog implements AfterReturningAdvice { @Override public void afterReturning(Object returnValue, Method method, Object[] args, Object target) throws Throwable { System.out.println("執行了"+method.getName()+"方法,返回結果為"+returnValue); } }
-
配置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" xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation="http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/aop https://www.springframework.org/schema/aop/spring-aop.xsd"> <!--註冊bean--> <bean id="log" class="com.dragon.log.Log"/> <bean id="user" class="com.dragon.service.UserServiceImpl"/> <bean id="afterLog" class="com.dragon.log.AfterLog"/> <aop:config> <!--切入點:expression:表示式--> <aop:pointcut id="pointcut" expression="execution(* com.dragon.service.UserServiceImpl.*(..))"/> <!--執行環繞--> <aop:advisor advice-ref="log" pointcut-ref="pointcut"/> <!--此處pointcut-ref為切入類--> <aop:advisor advice-ref="afterLog" pointcut-ref="pointcut"/> </aop:config> </beans>
-
測試類
import org.junit.Test; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class Test{ @Test public void t0(){ ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); UserService user = context.getBean("user",UserService.class); user.add(); } }
2.自定義類實現
與方式一不同的地方為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"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/aop
https://www.springframework.org/schema/aop/spring-aop.xsd">
<bean id="user" class="com.dragon.service.UserServiceImpl"/>
<!--自定義類-->
<bean id="diy" class="com.dragon.diy.DiyPoint"/>
<aop:config>
<!--自定義切面,ref要引入的類-->
<aop:aspect ref="diy">
<!--切入點-->
<aop:pointcut id="point" expression="execution(* com.dragon.service.UserServiceImpl.*(..))"/> <!--通知-->
<aop:before method="before" pointcut-ref="point"/>
</aop:aspect>
</aop:config>
</beans>
方式二並沒有方式一強大
3.註解實現
-
建立一個業務介面
-
實現該介面的類新增如下註解
import org.springframework.stereotype.Component; @Component("userServiceImpl") public class UserServiceImpl implements UserService{ public void add(){ System.out.println("使用者新增"); } }
-
編寫切面類
import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Before; import org.springframework.stereotype.Component; @Component @Aspect public class AnnoPoint { @Before("execution(* com.dragon.service.UserServiceImpl.*(..))") public void before(){ System.out.println("===方法執行前==="); } }
@Before("execution(* com.dragon.service.UserServiceImpl.*(..))"),注意此句是切到指定類中的某個方法中
-
配置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" xmlns:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" 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 http://www.springframework.org/schema/aop https://www.springframework.org/schema/aop/spring-aop.xsd"> <!--掃描指定包下的註解並生效--> <context:component-scan base-package="com.dragon.diy"/> <context:component-scan base-package="com.dragon.service"/> <context:annotation-config/> <!--找到被註解了的切面類,進行切面配置--> <aop:aspectj-autoproxy/> </beans>
-
利用測試類正常測試
注意事項,在配置xml檔案時,三行程式碼缺一不可
<context:component-scan base-package="com.dragon.diy"/>
<context:component-scan base-package="com.dragon.service"/>
<context:annotation-config/>
<!--找到被註解了的切面類,進行切面配置-->
<aop:aspectj-autoproxy/>