1. 程式人生 > 其它 >【Spring5】框架新功能

【Spring5】框架新功能

Spring5框架新功能

整個Spring5框架的程式碼基於Java8,執行時相容JDK9,許多不建議使用的類和方法在程式碼庫中刪除。

Spring5自帶了通用的日誌封裝:log4j2

已經移除了log4jConfigListener

①匯入所需的Jar包依賴

log4j-api-2.11.2.jar
log4j-core-2.11.2.jar
log4j-slf4j-impl-2.11.2.jar
log4j2.xml
slf4j-api-1.7.30.jar

②建立xml配置檔案

名稱固定為log4j2.xml

<?xml version="1.0" encoding="UTF-8"?>
<!--日誌級別以及優先順序排序: OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL -->
<!--Configuration後面的status用於設定log4j2自身內部的資訊輸出,可以不設定,當設定成trace時,可以看到log4j2內部各種詳細輸出-->
<configuration status="INFO">
    <!--先定義所有的appender-->
    <appenders>
        <!--輸出日誌資訊到控制檯-->
        <console name="Console" target="SYSTEM_OUT">
            <!--控制日誌輸出的格式-->
            <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
        </console>
    </appenders>
    <!--然後定義logger,只有定義了logger並引入的appender,appender才會生效-->
    <!--root:用於指定專案的根日誌,如果沒有單獨指定Logger,則會使用root作為預設的日誌輸出-->
    <loggers>
        <root level="info">
            <appender-ref ref="Console"/>
        </root>
    </loggers>
</configuration>

控制檯輸出

"C:\Program Files\Java\jdk1.8.0_301\bin\java.exe" -ea -Didea.test.cyclic.buffer.size=1048576 "-javaagent:D:\software\IntelliJ IDEA 2020.3.4\lib\idea_rt.jar=58596:D:\software\IntelliJ IDEA 2020.3.4\bin" -Dfile.encoding=UTF-8 -classpath "D:\software\IntelliJ IDEA 2020.3.4\lib\idea_rt.jar;D:\software\IntelliJ IDEA 2020.3.4\plugins\junit\lib\junit5-rt.jar;D:\software\IntelliJ IDEA 2020.3.4\plugins\junit\lib\junit-rt.jar;C:\Program Files\Java\jdk1.8.0_301\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_301\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.8.0_301\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.8.0_301\jre\lib\ext\cldrdata.jar;C:\Program Files\Java\jdk1.8.0_301\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.8.0_301\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.8.0_301\jre\lib\ext\jfxrt.jar;C:\Program Files\Java\jdk1.8.0_301\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.8.0_301\jre\lib\ext\nashorn.jar;C:\Program Files\Java\jdk1.8.0_301\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.8.0_301\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.8.0_301\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.8.0_301\jre\lib\ext\sunpkcs11.jar;C:\Program Files\Java\jdk1.8.0_301\jre\lib\ext\zipfs.jar;C:\Program Files\Java\jdk1.8.0_301\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.8.0_301\jre\lib\jce.jar;C:\Program Files\Java\jdk1.8.0_301\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.8.0_301\jre\lib\jfxswt.jar;C:\Program Files\Java\jdk1.8.0_301\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.8.0_301\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.8.0_301\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.8.0_301\jre\lib\resources.jar;C:\Program Files\Java\jdk1.8.0_301\jre\lib\rt.jar;D:\Programing\Hikaru\out\production\Hikaru;D:\Programing\Hikaru\lib\com.springsource.net.sf.cglib-2.2.0.jar;D:\Programing\Hikaru\lib\com.springsource.org.aopalliance-1.0.0.jar;D:\Programing\Hikaru\lib\com.springsource.org.aspectj.weaver-1.6.8.RELEASE.jar;D:\Programing\Hikaru\lib\commons-logging-1.1.1.jar;D:\Programing\Hikaru\lib\spring-aspects-5.2.6.RELEASE.jar;D:\Programing\Hikaru\lib\spring-beans-5.2.6.RELEASE.jar;D:\Programing\Hikaru\lib\spring-context-5.2.6.RELEASE.jar;D:\Programing\Hikaru\lib\spring-core-5.2.6.RELEASE.jar;D:\Programing\Hikaru\lib\spring-expression-5.2.6.RELEASE.jar;C:\Users\admin\.m2\repository\junit\junit\4.12\junit-4.12.jar;C:\Users\admin\.m2\repository\org\hamcrest\hamcrest-core\1.3\hamcrest-core-1.3.jar;D:\Programing\Hikaru\lib\spring-aop-5.2.6.RELEASE.jar;D:\Programing\Hikaru\lib\mysql-connector-java-8.0.28.jar;D:\Programing\Hikaru\lib\spring-tx-5.2.6.RELEASE.jar;D:\Programing\Hikaru\lib\spring-orm-5.2.6.RELEASE.jar;D:\Programing\Hikaru\lib\spring-jdbc-5.2.6.RELEASE.jar;D:\Programing\Hikaru\lib\druid-1.1.9.jar;D:\Programing\Hikaru\lib\log4j-api-2.11.2.jar;D:\Programing\Hikaru\lib\log4j-core-2.11.2.jar;D:\Programing\Hikaru\lib\log4j-slf4j-impl-2.11.2.jar;D:\Programing\Hikaru\lib\slf4j-api-1.7.30.jar" com.intellij.rt.junit.JUnitStarter -ideVersion5 -junit4 com.hikaru.service.AccountService,test
2022-04-10 09:27:20.937 [main] INFO  com.alibaba.druid.pool.DruidDataSource - {dataSource-1} inited

Process finished with exit code 0

手動輸出Log4j2日誌:LoggerFactory.getLogger

public class Log4j2Test {
    private static final Logger log = LoggerFactory.getLogger(Log4j2Test.class);

    public static void main(String[] args) {
        log.info("info log4j2");
        log.warn("warn log4j2");
    }
}

核心容器

支援候選元件索引(也可支援環境變數掃描)

支援@Nullable註解

①加在屬性上面表示屬性可以為空

    @Nullable
    @Autowired
    private JdbcTemplate jdbcTemplate;

②加在方法上面可以表示屬性返回值可以為空

③加在方法形參可以表示方法引數可以為空

    @Nullable
    @Override
    public void addMoney(@Nullable String id, double money) {
        String sql = "update t_account set money=money+? where id=?";
        jdbcTemplate.update(sql, money, id);
    }

函式式風格:GenericApplicationContext

目的是為了將new的物件加入IOC容器中

    @Test
    public void GenericContextText() {
        GenericApplicationContext context =
                new GenericApplicationContext();
        //清空IOC容器
        context.refresh();
        context.registerBean(Book.class, () -> new Book());
        Book book = context.getBean("com.hikaru.Book", Book.class);
        System.out.println(book);
    }

() -> new Book()為lambda表示式,lambda表示式允許將一個函式作為引數返回

如:(int x, int y) -> x + y,表示一個接收兩個值並返回他們的和的函式

在IOC容器中註冊Bean的時候並沒有預設Bean的名字為首字母小寫的類名,因此這裡使用了Bean的全路徑

也可以使用下面的方式指定IOC中Bean的名稱:

    @Test
    public void GenericContextText() {
        GenericApplicationContext context =
                new GenericApplicationContext();
        //清空IOC容器
        context.refresh();
        context.registerBean("book", Book.class, () -> new Book());
        Book book = context.getBean("book", Book.class);
        System.out.println(book);
    }

Spring5 支援整合JUnit5

整合JUnit4

①註解宣告單元測試框架

②註解載入配置檔案

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:bean.xml")
public class JUnitTest {
    @Autowired
    AccountService accountService;

    @Test
    public void test1() {
        accountService.accountMoney("1001", "1002", 500);
    }

}

@RunWith(SpringJUnit4ClassRunner.class) 可以使單元測試直接使用IOC容器,而不必通過applicationContext的方式

@ContextConfiguration("classpath:bean.xml")載入xml配置,執行IOC容器的一系列操作,所以下面的屬性可以直接裝配

Spring5整合Junit5

①引入Junit5的jar包

②建立測試類,同上

註解引用:

    @ExtendWith(SpringExtension.class)

配置檔案引入註解:

    @ContextConfiguration("classpath:bean1.xml")    

複合註解,等同於上面的兩個寫法:

    @SpringJunitConfig("classpath:bean1.xml")

Spring WebFlux