SpringBoot學習-第一章 新的Spring基礎-

Spring Boot學習,熟悉註解和Java式的配置。源代碼見Source-Sample-GitHub

Spring配置方式

  • 配置文件xml(Spring 1.x) 》》
  • 註解@annotation(Spring 2.x+Jdk1.5)》》
  • Java配置(Spring 3/4)

SpringBoot就是基於Java配置(註解的應用)

Spring組件

  • 核心組件(Core)
    • -Core:核心工具類,Spring其他模塊的主要依賴
    • -Bean:對bean的支持
    • -Context:運行時容器
    • -Context-Support:容器對第三方包的集成支持
    • -Expression:使用表達式語言查詢操作運行時的對象
  • AOP
    • -AOP:基於代理的AOP支持
    • -Aspects:基於AspectJ的AOP支持
  • Messaging
    • -Messaging:對消息架構和協議的支持
  • Web
    • -Web:基礎的集成功能,爲Web項目提供Spring容器
    • -Webmvc:基於Servlet的Spring MVC
    • -WebSocket:提供WebSocket功能
    • -Webmvc-Portlet:支持Portlet環境
  • Data Access/Integration
    • -JDBC:以JDBC方式訪問數據庫
    • -TX:事務支持
    • -ORM:對象關係映射支持
    • -OXM:對象xml映射支持
    • -JMS:對JMS的支持

Spring生態圈(獨立項目)

  • -Boot:使用默認配置快速開發
  • -XD:簡化大數據應用開發
  • -Cloud:分佈式系統開發工具集
  • -Data:對主流關係型/NoSql數據庫的支持
  • -Integration:通過消息機制對企業集成模式的支持
  • -Batch:簡化優化大數據批處理
  • -Security:認證授權
  • -Social:與社交網絡API的繼承
  • -Mobile:對手機設備的識別
  • -Web Services:基於協議有限的SOAP/Web服務
  • -Session:提供API管理用戶會話

Spring原則

  • 使用POJO進行輕量級和最小侵入式開發
  • 通過依賴注入和基於接口編程降低耦合
  • 通過AOP和默認習慣進行聲明式編程
  • 使用AOP和模板減少模式化(重複的)代碼

依賴注入 (IOC+DI)

即由Spring容器創建管理Bean(POJO類),通過註解/XML/JAVA告訴容器應該將Bean何時放在何地。

聲明Bean:
* @Component 通用
* @Service 在業務邏輯層使用
* @Repository 數據訪問層使用
* @Controller 展現層使用

引入Bean:
* @Autowired Spring提供的註解
* @Inject/@Resource JSR-330/JSR-250提供的註解

JAVA配置

@Configuration 表示這個類是一個配置類,等效於一個xml文件
@Bean 註解一個方法,將方法返回值註冊爲一個bean

  • 配置註解化
<context:component-scan base-package="com.controller"></context:component-scan>
@ComponentScan("com.controller") 
  • 配置Java化
<bean class="com.util.MySwaggerConfig"/>
@Configuration
public class JavaConfig{
    @Bean
    public MySwaggerConfig mySwaggerConfig(){
        return new MySwaggerConfig();
    } 
}

使用Aspectj實現AOP

有兩種方式,一個是監聽方法(通過配置目標路徑),一個是監聽註解(在目標方法上放置特殊註解)
* 定義註解,作爲被監聽的標識

/**
 * 註解本身是沒有作用的,只是作爲一個規則,關聯攔截者和被攔截者
 */
@Target(ElementType.METHOD)//用於方法
@Retention(RetentionPolicy.RUNTIME)//可用於運行時
@Documented
public @interface AopAction {
    String name();
}
  • 書寫被攔截的Service(註解式攔截,需要註解Service的方法)
/**
 * 註解式攔截,在對應方法上加上@AopAction,在攔截時通過檢查註解進行攔截
 */
@Service
public class DemoAnnotationAopService {
    @AopAction(name = "註解式AOP")
    public String say() {
        return "Hello,Annotation World.";
    }
}

@Service
public class DemoMethodAopService {
    public String say() {
        return "Hello, Normal World.";
    }
}
  • 定義攔截器實現,定義攔截的對象和處理方法
/**
 * Aop實現的地方
 */
@Aspect//聲明一個切面
@Component//託管給Spring容器
public class AspectAopImpl {
    private final Logger log = LoggerFactory.getLogger(this.getClass());
    /**
     * 註解式,通過檢查註解位置來攔截
     */
    @Pointcut("@annotation(demo.springboot.aop.impl.AopAction)")
    public void annotationPointCut() {}

    @Before("annotationPointCut()")
    public void logBefore() { log.info("logBefore:現在時間是:" + new Date()); }

    /**
     * 通過指定攔截位置和具體方法
     */
    @Pointcut("execution(* demo.springboot.aop.service.DemoMethodAopService.*(..))")
    private void methodPointCut() {}

    @After("methodPointCut()")
    public void logAfter() { log.info("logAfter:現在時間是:" + new Date()); }
}

啓用AOP

注入配置文件,開啓AspectJ

/**
* 用註解代替了xml
* <aop:aspectj-autoproxy proxy-target-class="true"/>
*/
@EnableAspectJAutoProxy
@Configuration
@ComponentScan("demo.springboot.aop")//在Application入口整體掃描,可省略此行
public class AopConfiguration {
    public static void main(String[] args) {
        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AopConfig.class);
         /**
         * 測試兩種Aop
         */
         DemoAnnotationAopService annotationAopService = context.getBean(DemoAnnotationAopService.class);
        DemoMethodAopService methodAopService = context.getBean(DemoMethodAopService.class);

        System.out.println(annotationAopService.say());
        System.out.println(methodAopService.say());
        context.close();
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章