Weitere ähnliche Inhalte Ähnlich wie Spring Bootで変わる Javaアプリ開発! #jsug (20) Mehr von Toshiaki Maki (20) Kürzlich hochgeladen (12) Spring Bootで変わる Javaアプリ開発! #jsug5. JJUG CCC 2014 Fall
http://www.java-users.jp/?p=1253
2014/11/15(土)
2014/09/30までCall for Paper募集中!
Springネタを是非お待ちしております!
19. Mavenアーキタイプでプロジェ
クト雛形生成
$ mvn -B archetype:generate -DgroupId=com.example
-DartifactId=jsug-helloworld -Dversion=1.0.0-
SNAPSHOT -DarchetypeArtifactId=maven-archetype-
quickstart
Spring Bootに関係のない汎用的な手順
24. package com.example;
!
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
!
@RestController
@EnableAutoConfiguration
public class App {
!
@RequestMapping("/")
String home() {
return "Hello World!";
}
!
public static void main(String[] args) {
SpringApplication.run(App.class, args);
}
}
魔法のアノテーション
mainメソッドでアプリ実行
47. @EnableConfigurationProperties(JpaProperties.class)
@Import(DataSourceInitializedPublisher.Registrar.class)
public abstract class JpaBaseConfiguration implements BeanFactoryAware {
!
// ...
@Bean
@ConditionalOnMissingBean
public EntityManagerFactoryBuilder entityManagerFactoryBuilder(
JpaVendorAdapter jpaVendorAdapter) {
EntityManagerFactoryBuilder builder = new EntityManagerFactoryBuilder(
jpaVendorAdapter, this.jpaProperties, this.persistenceUnitManager);
builder.setCallback(getVendorCallback());
return builder;
}
@Bean
@Primary
@ConditionalOnMissingBean
public LocalContainerEntityManagerFactoryBean entityManagerFactory(
EntityManagerFactoryBuilder factory) {
return factory.dataSource(this.dataSource).packages(getPackagesToScan())
.properties(getVendorProperties()).build();
}
}
HibernateJpaAutoConfiguration
の親クラス
EntityManagerFactory
の生成
50. @Service
@Transactional
public class BookmarkService {
@Autowired
BookmarkRepository bookmarkRepository;
!
public List<Bookmark> findAll() {
return bookmarkRepository.findAll(new Sort(Sort.Direction.ASC, "id"));
}
!
public Bookmark save(Bookmark bookmark) {
return bookmarkRepository.save(bookmark);
}
!
public void delete(Long id) {
bookmarkRepository.delete(id);
}
}
public interface BookmarkRepository
extends JpaRepository<Bookmark, Long>
{
!
}
特別な設定なしでSpring Data JPAが使える。特別な設定なしでSpring Data JPAが使える。
56. 例1: 「Spring Social Twitter」を
使ってつぶやく
HelloWorldアプリから10数行だけ
コードを足して、OAuth認可後、
Twitterへツイートできるようにする。
58. @RestController
@EnableAutoConfiguration
public class App {
@Autowired
ConnectionRepository connectionReposiory;
@Autowired
Twitter twitter;
!
@RequestMapping("/")
String home(@RequestParam("tweet") String tweet) {
if (connectionRepository.findPrimaryConnection(Twitter.class) == null) {
return "<a href='/connect/twitter'>Please connect</a>";
}
twitter.timelineOperations().updateStatus(tweet);
return tweet + " is tweeted!";
}
!
public static void main(String[] args) {
SpringApplication.run(App.class, args);
}
}
App.java編集
73. 起動スクリプト(RedHat系)
# 途中略
case "$1" in
start)
echo -n "Starting MyApp "
nohup java $JVM_OPTS -jar $MYAPP_HOME/myapp.jar $PARAMS >> $LOG_FILE 2>&1 &
pid=$!
echo $pid > "$MYAPP_PID_FILE"
success
echo
;;
stop)
echo -n "Shutting down MyApp "
killproc myapp
RETVAL=$?
echo
;;
*)
echo "Usage: $0 {start|stop}"
exit 1
;;
esac
/etc/init.d/myapp start
/etc/init.d/myapp stop
76. Herokuとローカルで
DBを動的に切り替えたい場合
@Bean(destroyMethod = "close")
DataSource dataSource() throws URISyntaxException {
String url, username, password;
String databaseUrl = System.getenv("DATABASE_URL");
if (databaseUrl != null) {
URI dbUri = new URI(databaseUrl);
url = "jdbc:postgresql://" + dbUri.getHost() + dbUri.getPath() + ":" +
dbUri.getPort() + dbUri.getPath();
username = dbUri.getUserInfo().split(":")[0];
password = dbUri.getUserInfo().split(":")[1];
} else {
url = this.properties.getUrl();
username = this.properties.getUsername();
password = this.properties.getPassword();
}
DataSourceBuilder factory = DataSourceBuilder
.create(this.properties.getClassLoader())
.url(url)
.username(username)
.password(password);
return factory.build();
}
Herokuでは環境変数
DATABASE_URLにDB情報
が含まれる
Herokuの場合
ローカルの場合
Spring Cloudというサブプロジェク
トを使うとこのへんを吸収できる
78. 実行時にProfile指定
web: java $JAVA_OPTS -jar target/*.jar —server.port=$PORT
--spring.profiles.active=heroku
Procfileに--spring.profiles.active
でherokuプロファイルを指定
ちなみにこれはBoot以前からある機能。
YAMLもSpring4.1から本体に取り込まれる。