Kiedy i jak należy tworzyć beany o co z nimi chodzi? Czy dla każdej klasy w której będę chciał skorzystać UserService muszę tworzyć beana i powtarzać ten kod:
try (AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext()) {
ctx.scan(CONFIG_PACKAGE);
ctx.refresh();
UserService bean = ctx.getBean(UserService.class);
UserController bean2 = ctx.getBean(UserController.class);
bean2.btnSaveUser(new User("Jan", "Dwa", "5342"));
// userController.btnSaveUser();
}
package com.my.app;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import com.my.app.configuration.*;
import com.my.app.controller.UserController;
import com.my.app.model.User;
import com.my.app.service.UserService;
public class Main {
private static final String CONFIG_PACKAGE = "com.my.app.configuration";
public static void main(String[] args) {
// TODO Auto-generated method stub
try (AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext()) {
ctx.scan(CONFIG_PACKAGE);
ctx.refresh();
UserService bean = ctx.getBean(UserService.class);
UserController bean2 = ctx.getBean(UserController.class);
bean2.btnSaveUser(new User("Jan", "Dwa", "5342"));
// userController.btnSaveUser();
}
}
}
package com.my.app.configuration;
import java.util.Properties;
import javax.sql.DataSource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import org.springframework.core.env.Environment;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
import org.springframework.orm.jpa.JpaTransactionManager;
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter;
import org.springframework.transaction.annotation.EnableTransactionManagement;
import com.jolbox.bonecp.BoneCPDataSource;
import com.my.app.controller.UserController;
import com.my.app.service.UserService;
@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(basePackages = "com.my.app.repository")
@PropertySource("classpath:application.properties")
public class DataJpaConfig {
protected static final String PROPERTY_NAME_DATABASE_DRIVER = "db.driver";
protected static final String PROPERTY_NAME_DATABASE_PASSWORD = "db.password";
protected static final String PROPERTY_NAME_DATABASE_URL = "db.url";
protected static final String PROPERTY_NAME_DATABASE_USERNAME = "db.username";
private static final String PROPERTY_NAME_HIBERNATE_DIALECT = "hibernate.dialect";
private static final String PROPERTY_NAME_HIBERNATE_FORMAT_SQL = "hibernate.format_sql";
private static final String PROPERTY_NAME_HIBERNATE_HBM2DDL_AUTO = "hibernate.hbm2ddl.auto";
private static final String PROPERTY_NAME_HIBERNATE_NAMING_STRATEGY = "hibernate.ejb.naming_strategy";
private static final String PROPERTY_NAME_HIBERNATE_SHOW_SQL = "hibernate.show_sql";
private static final String PROPERTY_PACKAGES_TO_SCAN = "com.my.app.model";
@Autowired
private Environment environment;
@Bean
public DataSource dataSource() {
BoneCPDataSource dataSource = new BoneCPDataSource();
dataSource.setDriverClass(environment.getRequiredProperty(PROPERTY_NAME_DATABASE_DRIVER));
dataSource.setJdbcUrl(environment.getRequiredProperty(PROPERTY_NAME_DATABASE_URL));
dataSource.setUsername(environment.getRequiredProperty(PROPERTY_NAME_DATABASE_USERNAME));
dataSource.setPassword(environment.getRequiredProperty(PROPERTY_NAME_DATABASE_PASSWORD));
return dataSource;
}
@Bean
public JpaTransactionManager transactionManager() {
JpaTransactionManager transactionManager = new JpaTransactionManager();
transactionManager.setEntityManagerFactory(entityManagerFactory().getObject());
return transactionManager;
}
@Bean
public LocalContainerEntityManagerFactoryBean entityManagerFactory() {
LocalContainerEntityManagerFactoryBean entityManagerFactoryBean = new LocalContainerEntityManagerFactoryBean();
entityManagerFactoryBean.setDataSource(dataSource());
entityManagerFactoryBean.setJpaVendorAdapter(new HibernateJpaVendorAdapter());
entityManagerFactoryBean.setPackagesToScan(PROPERTY_PACKAGES_TO_SCAN);
Properties jpaProperties = new Properties();
jpaProperties.put(PROPERTY_NAME_HIBERNATE_DIALECT,
environment.getRequiredProperty(PROPERTY_NAME_HIBERNATE_DIALECT));
jpaProperties.put(PROPERTY_NAME_HIBERNATE_FORMAT_SQL,
environment.getRequiredProperty(PROPERTY_NAME_HIBERNATE_FORMAT_SQL));
jpaProperties.put(PROPERTY_NAME_HIBERNATE_HBM2DDL_AUTO,
environment.getRequiredProperty(PROPERTY_NAME_HIBERNATE_HBM2DDL_AUTO));
jpaProperties.put(PROPERTY_NAME_HIBERNATE_NAMING_STRATEGY,
environment.getRequiredProperty(PROPERTY_NAME_HIBERNATE_NAMING_STRATEGY));
jpaProperties.put(PROPERTY_NAME_HIBERNATE_SHOW_SQL,
environment.getRequiredProperty(PROPERTY_NAME_HIBERNATE_SHOW_SQL));
entityManagerFactoryBean.setJpaProperties(jpaProperties);
return entityManagerFactoryBean;
}
@Bean
public UserService userServiceBean() {
return new UserService();
}
@Bean
public UserController uControllerBean(){
return new UserController();
}
}
package com.my.app.controller;
import org.springframework.beans.factory.annotation.Autowired;
import com.my.app.model.User;
import com.my.app.service.UserService;
public class UserController {
@Autowired
private UserService userService;
public void btnSaveUser(User user){
userService.saveUser(user);
}
}
package com.my.app.repository;
import org.springframework.data.jpa.repository.JpaRepository;
import com.my.app.model.User;
public interface UserRepository extends JpaRepository<User, Long> {
}
package com.my.app.service;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.my.app.model.User;
import com.my.app.repository.UserRepository;
@Service
public class UserService {
@Autowired
private UserRepository userRepository;
public User saveUser(User user){
return userRepository.save(user);
}
}