赞
踩
为啥要用纯注解方式呢?因为xml中代码还是有点多,纯注解可以解决该问题
现在要做的很简单,就是用新建的SpringConfig这个类去替代xml
在测试类中加载核心配置类 SpringConfig类中 @Configuratio Spring.xml配置类 @ComponentScan <!--开启注解扫描--> @PropertySource <!--加载属性配置文件--> <!--数据源--> <!--JdbcTempalte层-->
//@Bean注解的作用,将@Bean放到一个有返回值为的方法上面,@Bean注解会将该方法的返回值放到ioc容器中,拿这个数据的时候要通过id找他。可自己指定id 格式: @Bean("指定的id名字")
举个例子:创建一个返回值类型为DataSource的方法,此时@Bean注解会将该方法的返回值dataSource放到ioc容器中,当要使用dataSource,可通过指定的id
- @Bean("dataSource")
- public DataSource getDataSource() {
- ComboPooledDataSource dataSource=new ComboPooledDataSource();
- return dataSource;
- }
Value注解的作用,是将资源文件中的数据,赋值给类中的成员属性
举个例子:此时,driver=com.mysql.cj.jdbc.Driver
- @Value("${jdbc.driver}")
- private String driver;
@Qualifier("")的作用:多个数据源时,指定要用的数据源
SpringConfig
- package wwx.config;
-
- import com.mchange.v2.c3p0.ComboPooledDataSource;
- import org.springframework.beans.factory.annotation.Qualifier;
- import org.springframework.beans.factory.annotation.Value;
- import org.springframework.context.annotation.Bean;
- import org.springframework.context.annotation.ComponentScan;
- import org.springframework.context.annotation.Configuration;
- import org.springframework.context.annotation.PropertySource;
- import org.springframework.jdbc.core.JdbcTemplate;
-
- import javax.sql.DataSource;
- import java.beans.PropertyVetoException;
-
- @Configuration //加上@Configuration就相当于Spring.xml配置类
- @ComponentScan("wwx")
- @PropertySource("classpath:jdbc.properties")
- public class SpringConfig {
-
- @Value("${jdbc.driver}")
- private String driver;
- @Value("${jdbc.url}")
- private String url;
- @Value("${jdbc.username}")
- private String username;
- @Value("${jdbc.password}")
- private String password;
- //@Bean注解的作用,将@Bean放到一个返回值为DataSource的方法中,@Bean注解会将该方法的返回值放到ioc容器中,拿这个数据的时候
- //要通过id找他。可自己指定id 格式为@Bean("指定的id名字")
-
- // <!--数据源-->
- @Bean("dataSource")
- public DataSource getDataSource() throws Exception {
- ComboPooledDataSource dataSource=new ComboPooledDataSource();
- dataSource.setDriverClass(driver);
- dataSource.setJdbcUrl(url);
- dataSource.setUser(username);
- dataSource.setPassword(password);
- return dataSource;
- }
- //容器中有一个数据源了,当用到以下模板时,容器会自动注入该数据源
- //若容器中有多个数据源,可以在方法中添加注解@Qualifier("id名")指定要用的数据源
- @Bean("jdbcTemplate")
- public JdbcTemplate getJDBCTemplate(@Qualifier("dataSource") DataSource dataSource){
- JdbcTemplate jdbcTemplate=new JdbcTemplate();
- jdbcTemplate.setDataSource(dataSource);
- return jdbcTemplate;
- }
-
- }
jdbc.properties
- jdbc.driver=com.mysql.cj.jdbc.Driver
- jdbc.url=jdbc:mysql://localhost:3306/wwx?useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true&characterEncoding=utf-8
- jdbc.username=root
- jdbc.password=123456
JDBCTest
- package wwx.test;
- import org.junit.Test;
- import org.springframework.context.ApplicationContext;
- import org.springframework.context.annotation.AnnotationConfigApplicationContext;
- import org.springframework.context.support.ClassPathXmlApplicationContext;
- import wwx.config.SpringConfig;
- import wwx.dao.AccountDao;
- import wwx.domain.Account;
- import wwx.service.AccountService;
- import wwx.service.AccountServiceImpl;
-
- import java.util.List;
-
- public class JDBCTest {
- @Test
- public void test01()
- { //在test中创建了一个业务层对象,用业务层对象调用业务层中的调用方法,
- // 此时业务层方法中创建了Dao对象,调用了Dao方法
- //这样写的话,类与类直接耦合度太高了,
- // 举个例子,假设Dao包下的AccountDaoImpl突然没有了,AccountServiceImpl中代码就会报错
- //该如何解决呢,使用Spring:解耦,降低类内之间的联系,
- //也就是不用在AccountServiceImpl中去new Dao ,让Spring去new,如果要用到,通过注入方式注入进来
- // AccountService accountService=new AccountServiceImpl();
- // accountService.findAll();
-
- //加载配置文件
- // ApplicationContext app=new ClassPathXmlApplicationContext("Spring.xml");
- //获得bean
- //spring容器中id唯一
-
- //加载核心配置类
- ApplicationContext app=new AnnotationConfigApplicationContext(SpringConfig.class);
- //需要强转
- AccountService accountService = (AccountService) app.getBean("accountService");
-
-
- //调用方法
- List<Account> list = accountService.findAll();
- System.out.println(list+"在test里输出的哦");
-
- //此时删除AccountServiceImpl,编译不会报错,但是无法运行,耦合不能消除,但能降低
-
-
-
-
- }
-
-
- }
AccountDaoImpl
- package wwx.dao;
-
- import org.springframework.beans.factory.annotation.Autowired;
- import org.springframework.beans.factory.annotation.Qualifier;
- import org.springframework.jdbc.core.BeanPropertyRowMapper;
- import org.springframework.jdbc.core.JdbcTemplate;
- import org.springframework.stereotype.Repository;
- import org.springframework.stereotype.Service;
- import wwx.domain.Account;
-
- import java.util.List;
-
- @Repository("accountDao")
- public class AccountDaoImpl implements AccountDao {
- //创建jdbcTemplate成员变量,及set方法
- @Autowired
- @Qualifier("jdbcTemplate")
- private JdbcTemplate jdbcTemplate;
-
- //使用注解不需要使用set方法,可把set方法注释掉
- //public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
- // this.jdbcTemplate = jdbcTemplate;
- // }
-
- //查询所有
- @Override
- public List<Account> findAll() {
- System.out.println("我是Dao...");
- // JdbcTemplate jdbcTemplate=new JdbcTemplate();
- // jdbcTemplate.query();不用这种方式
- List<Account> list
- = jdbcTemplate.query("select * from account", new BeanPropertyRowMapper<Account>(Account.class));
-
- return list;
- }
- }
AccountServiceImpl
- package wwx.service;
- import org.springframework.beans.factory.annotation.Autowired;
- import org.springframework.beans.factory.annotation.Qualifier;
- import org.springframework.stereotype.Service;
- import wwx.dao.AccountDao;
- import wwx.dao.AccountDaoImpl;
- import wwx.domain.Account;
-
- import java.util.List;
- //在xml中<!--开启注解扫描-->
- // <context:component-scan base-package="wwx"></context:component-scan>
- //在类名上面添加@Servie注解,相当于spring.xml中的<bean id="accountService" class="wwx.service.AccountServiceImpl">
- //相当于在这个容器中创建有一个AccountServiceImpl这个类的对象,这个对象的id是类名首字母小写
- //如果想指定类名,格式为@Service("指定名字"),在AccountDaoImpl中,执行与这里相同步骤,不过注解为@Repository,此时已经实现配置
- //再接着进行注入,使用@Autowired注解,此注解是根据类型注入的,看容器中是否有这个接口类型配合使用@Qualifier
- //使用注解不需要使用set方法,可把set方法注释掉
- //此时实现我们自己写的类,用注解,jar包中的类用xml,将xml中的Service层,Dao层注释掉
- @Service("accountService")
- public class AccountServiceImpl implements AccountService {
- @Autowired //<property name="accountDao" ref="accountDao"></property>
- @Qualifier("accountDao")
- private AccountDao accountDao;//创建accountDao
-
- // public void setAccountDao(AccountDao accountDao) {
- // this.accountDao = accountDao;
- // }
-
- @Override
- public List<Account> findAll() {
- System.out.println("我是service...");
- // AccountDao accountDao=new AccountDaoImpl();
- List<Account> list = accountDao.findAll();
- return list;
- }
- }
AccountDao
- package wwx.dao;
-
- import wwx.domain.Account;
-
- import java.util.List;
-
- public interface AccountDao {
- //查询所有
- public List<Account> findAll();
- }
AccountService
- package wwx.service;
-
- import wwx.domain.Account;
-
- import java.util.List;
-
- public interface AccountService {
- //查询所有
- public List<Account> findAll();
- }
-
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。