spring boot @SpringBootApplication,@EnableAutoConfiguration ใช้ทำอะไร

@SpringBootApplication
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(LoginApplication.class, args);
    }
}

The Spring Boot documentation อธิบาย @SpringBootApplication ไว้ว่า

The @SpringBootApplication annotation is equivalent to using @Configuration, @EnableAutoConfiguration and @ComponentScan with their default attributes: [...]

Many Spring Boot developers always have their main class annotated with @Configuration, @EnableAutoConfiguration and @ComponentScan. Since these annotations are so frequently used together (especially if you follow the best practices above), Spring Boot provides a convenient @SpringBootApplication alternative.

“เนื่องจากโปรแกรมเมอร์จำนวนมาก ใช้ annotated 3 อันนี้ร่วมกันบ่อยครั้ง @Configuration,@EnableAutoConfiguration และ @ComponentScan จึงยุบรวมอยู่ใน @SpringBootApplication ไปเลย”

ทีนี้เรามาดูกันว่า Annonation 3 ตัวนี้ทำหน้าที่อะไร

  1. @Configuration tags the class as a source of bean definitions for the application context. (Class ที่มี source ของ Bean ด้วย method ที่มี @Bean)
  2. @EnableAutoConfiguration It tells Spring to setup some basic infrastructure judging by what you have in the classpath. It’s done by invoking a so called import class that’s derived from the value of the @Import annotation that @EnableAutoConfiguration includes. Only one class should be annotated with @EnableAutoConfiguration (โหลดใช้งาน Required Bean ที่จำเป็นให้เราอัตโนมัติ เช่นถ้าใช้ JPA มันก็จะมองหา @Entity ให้อัตโนมัติ)
  3. @ComponentScan tells Spring to look for other components, configurations, and services in the the root package, allowing it to find the controllers. (บอกให้ Spring รู้จัก Annotated ภายใต้ Package ที่ระบุ ถ้าไม่ระบุก็จะเป็น ภายใต้ Package ของ Class ที่ใส่ @ComponentScan)

ถ้าหากต้องการ Custom เราสามารถใส่ Annotated เพิ่มเติมได้ เช่น หากเราไม่ต้องการโหลด Config บางตัวอัตโนมัติ

@SpringBootApplication
@EnableAutoConfiguration(exclude = LiquibaseAutoConfiguration.class)
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(LoginApplication.class, args);
    }

}

แหล่งอ้างอิง

https://docs.spring.io/spring-boot/docs/current/reference/html/using-boot-using-springbootapplication-annotation.html

https://stackoverflow.com/questions/33619532/configuration-using-annotation-springbootapplication

https://stackoverflow.com/questions/39247487/why-spring-boot-application-class-needs-to-have-configuration-annotation

Posted in spring boot | Leave a comment

spring boot transactional force commit

บางครั้งถ้ามี Query หลายๆ Statement ต่อกัน อาจทำให้เกิดข้อผิดพลาด Constraint เช่นพวก Unique ได้ เพราะมันจะรอ commit พร้อมกัน เราจึงต้องย้ายบาง Statement ไปสร้างเป็น method ใหม่ และใส่ Annonation นี้ไว้บนหัว method เพื่อที่จะ force commit

@Transactional(value = "transactionManager",propagation = Propagation.REQUIRES_NEW)

https://stackoverflow.com/questions/24338150/how-to-manually-force-a-commit-in-a-transactional-method

Posted in jquery, spring boot | Leave a comment

oracle jdbc connection style

Thin-style

jdbc:oracle:thin:@HOST:PORT/SERVICE_NAME

TNSname-style

jdbc:oracle:thin:@(description=(address=(host=HOST)(protocol=tcp)
(port=PORT))(CONNECT_DATA=(SERVICE_NAME=SERVICE_NAME)))

TNSNames Alias Syntax

You can find the available TNSNAMES entries listed in the tnsnames.ora file on the client computer from which you are connecting. On Windows, this file is located in the ORACLE_HOME\NETWORK\ADMIN directory. On UNIX systems, you can find it in the ORACLE_HOME directory or the directory indicated in your TNS_ADMIN environment variable.

For example, if you want to connect to the database on host myhost as user scott with password tiger that has a TNSNAMES entry of MyHostString, then write the following:

OracleDataSource ods = new OracleDataSource();
ods.setTNSEntryName("MyTNSAlias");
ods.setUser("scott");
ods.setPassword("tiger");
ods.setDriverType("oci");
Connection conn = ods.getConnection();

The oracle.net.tns_admin system property must be set to the location of the tnsnames.ora file so that the JDBC Thin driver can locate the tnsnames.ora file. For example:

System.setProperty("oracle.net.tns_admin", "c:\\Temp");
String url = "jdbc:oracle:thin:@tns_entry";

Note:

When using TNSNames with the JDBC Thin driver, you must set the oracle.net.tns_admin property to the directory that contains your tnsnames.ora file.

java -Doracle.net.tns_admin=$ORACLE_HOME/network/admin

Spring boot datasource

public DataSource dataSourceWrite() {
DataSource dataSource = new DataSource();
dataSource.setDriverClassName(driverClassName);
dataSource.setUrl(OracleUrl);
dataSource.setUsername(OracleUsername);
dataSource.setPassword(OraclePassword);
dataSource.setMaxActive(maxActive);
dataSource.setMaxIdle(maxIdle);
dataSource.setMinIdle(minIdle);
dataSource.setInitialSize(initialSize);
dataSource.setMaxWait(maxWait);
dataSource.setTestOnBorrow(true);
dataSource.setValidationQuery("SELECT * FROM DUAL");
return dataSource;
}

reference http://docs.oracle.com/cd/B28359_01/java.111/b31224/urls.htm

Posted in java | Leave a comment

how to verify facebook access token?

1.Get App AccessToken

https://graph.facebook.com/oauth/access_token?client_id=xxx&client_secret=yyy&grant_type=client_credentials

2.Get Token Info

https://graph.facebook.com/debug_token?input_token=Facebook Token&access_token=App Access Token

Posted in ไม่มีหมวดหมู่ | Leave a comment

php opcache คืออะไร ติดตั้งอย่างไร

php opcache คืออะไร ติดตั้งอย่างไร

OpCache จะเก็บคอมไพล์โค้ด PHP (OpCodes) ลงใน memory เก็บเป็น cache และนำมาใช้ใหม่ re-used โดยตั้งแต่ php5.5 จะมี OpCache อยู่ใน core php อยู่แล้ว แต่ถ้าต่ำกว่า 5.4 และ มากกว่า 5.2 เราสามารถติดตั้งเองได้ โดยจะทำให้ php application โดยรวมเร็วขึ้น 40-70% เลยทีเดียว

yum install php-pecl-apcu

# Install APC (Alternative PHP Cache) เอาไว้ cache code โดยจะ cache มันไว้ ณ compile state
pecl install apc
#nano /etc/php.d/apc.ini
extension=apc.so
apc.enabled=1

yum install php-pecl-zendopcache

restart apache

check phpinfo

opcache phpinfo

recommended setting

; Sets how much memory to use
opcache.memory_consumption=128

;Sets how much memory should be used by OPcache for storing internal strings
;(e.g. classnames and the files they are contained in)
opcache.interned_strings_buffer=8

; The maximum number of files OPcache will cache
opcache.max_accelerated_files=4000

;How often (in seconds) to check file timestamps for changes to the shared
;memory storage allocation.
opcache.revalidate_freq=60

;If enabled, a fast shutdown sequence is used for the accelerated code
;The fast shutdown sequence doesn't free each allocated block, but lets
;the Zend Engine Memory Manager do the work.
opcache.fast_shutdown=1

;Enables the OPcache for the CLI version of PHP.
opcache.enable_cli=1
Posted in php | Leave a comment