Spring 02 基于注解的IOC以及IOC的案例

6 篇文章 0 订阅

1. 知识点

  1. Spring中的常用注解
  2. 案例使用xml方式和注解方式实现单标CRUD操作
    持久层技术选择:dbutils
  3. 改造基于注解的IOC案例,使用纯注解的方式实现
  4. Spring和Junit的整合

2. Spring中的常用注解

2.1 注解的作用

用于创建对象的,他们的作用就和xml配置文件中编写一个bean标签实现的功能是一样的

2.2 常用注解

@Component:

  1. 作用:用于把当前类对象存入Spring容器中
  2. 属性:value:用于指定bean的id,当我们不写时,它的默认值是当前类名,并且首字母改小写

@Controller:

一般用于表现层

@Service:

一般用于业务层

@Repository:

一般用于持久层

以上三个注解他们的作用和Component一模一样用于注入数据的    
他们的作用就和xml配置文件中的bean标签中写一个<property>标签是一样的  

@Autowired:

  1. 作用:

    自动按照类型注入,只要容器中有唯一一个bean对象类型和要注入的变量类型匹配,就可以注入成功
    如果IOC容器中没有任何bean类型和要注入的变量类型匹配,则报错
    如果IOC容器中有多个类型匹配时,首先按照类型匹配,再按照使用的类名匹配

  2. 位置:可以使成员变量也可以是方法

  3. 细节:在使用注解注入时,set方法就不是必须的了

@Qualifier:

  1. 作用 :在按照类注入的基础上再按照名称注入,他在给类成员注入时时,不能单独使用,但是在给方法参数注入时,可以

  2. 属性:value:用于指定bean的id

以上三个注入只能注入其他bean类型的数据,而基本数据和String类型无法使用上述注解    
另外:集合类型的注入只能通过xml来实现   

@Value:

  1. 作用:用于注入基本类型和String类型的数据
  2. 属性: value:用于指定指定数据的值,它可以使用使用Spring中的el表达式

@Resource

  1. 作用:直接按照bean的id注入
  2. 属性:name:用于指定bean的id用于改变作用范围的

@Scope:

  • 作用:指定单例、多例
  • 他们的作用就和在bean标签中使用scope属性实现的功能是一致的和生命周期相关的

@PreDestory:

  • 作用:用于指定销毁方法

@PostConstruct:

  • 作用:用于指定初始方法
  • 他们的作用就和在bean标签中使用init-method和destory-method的作用是一样的

3. 案例:使用xml方式实现单标CRUD操作

<!--配置Service对象-->   
<bean id="accountService" class="com.zrf.service.impl.AccountServiceImpl">        
    <!--注入到=dao--> 
    <property name="accountDao" ref="accountDao">
    </property>    
</bean>       
<!--配置Dao对象-->    
<bean id="accountDao" class="com.zrf.dao.impl.AccountDaoImpl">        
    <!--注入QueryRunner--> 
    <property name="runner" ref="runner">
    </property>   
</bean>   
<!--配置QueryRunner-->
<bean id="runner" class="org.apache.commons.dbutils.QueryRunner" scope="prototype">
    <!--注入数据源-->        
    <constructor-arg name="ds" ref="dataSource">
    </constructor-arg>   
</bean>       
<!--配置数据源对象-->    
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
    <!--连接数据库的必备信息-->        
    <property name="driverClass" value="com.mysql.cj.jdbc.Driver">
    </property>        
    <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/eesy?characterEncoding=utf8&amp;serverTimezone=UTC&amp;useSSL=false">
    </property>        
    <property name="user" value="root">
    </property>        
    <property name="password" value="root">
    </property>    
</bean>

4. 案例:使用纯注解方式实现单标CRUD操作

<!--配置Service对象-->   
<bean id="accountService" class="com.zrf.service.impl.AccountServiceImpl">        
    <!--注入到=dao--> 
    <property name="accountDao" ref="accountDao">
    </property>    
</bean>

替换成:

@Service("accountService")
public class AccountServiceImpl implements IAccountService {    
    @Autowired    
    private IAccountDao accountDao;
}
<bean id="accountDao" class="com.zrf.dao.impl.AccountDaoImpl">        
    <!--注入QueryRunner--> 
    <property name="runner" ref="runner">
    </property>   
</bean>   

替换成:

@Repository("accountDao")
public class AccountDaoImpl implements IAccountDao {    
    @Autowired    
    private QueryRunner runner;
}
<!--配置QueryRunner-->
<bean id="runner" class="org.apache.commons.dbutils.QueryRunner" scope="prototype">
    <!--注入数据源-->        
    <constructor-arg name="ds" ref="dataSource">
    </constructor-arg>   
</bean> 

替换成:

@Bean(name = "runner")
public QueryRunner createQueryRunner(DataSource dataSource) {
    return new QueryRunner(dataSource);
}
<!--配置数据源对象-->    
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
    <!--连接数据库的必备信息-->        
    <property name="driverClass" value="com.mysql.cj.jdbc.Driver">
    </property>        
    <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/eesy?characterEncoding=utf8&amp;serverTimezone=UTC&amp;useSSL=false">
    </property>        
    <property name="user" value="root">
    </property>        
    <property name="password" value="root">
    </property>    
</bean>

替换成

@Configuration
public class JDBConfig {    
    @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(name = "dataSource")    
    //创建数据源对象
    public DataSource createDataSource() {        
        ComboPooledDataSource ds = new ComboPooledDataSource();       
        try {            
        ds.setDriverClass(driver);        
        } catch (PropertyVetoException e) {            
        throw new RuntimeException(e);        
        }        
        ds.setJdbcUrl(url);       
        ds.setUser(username);        
        ds.setPassword(password);        
        return ds;    
	}
}

5. Spring和JUnit的整合

  • 使用Juit单元测试,测试我们的配置

Spring整合JUnit的配置

  1. 导入Spring整合Junit的坐标
  2. 使用junit提供的注解把原有的main方法替换了,替换成spring提供的

@RunWith

  • 告知Spring的运行期,Spring和ioc创建是基于xml还是注解的,并说明位置

@ContextConfiguration

  1. locations:指定xml文件的位置,加上classpath关键字,表示类路径
  2. classes:指定注解类的位置

注意:

  • 当我使用spring5.x版本的时候,要SpringConfigure求juit的java必须是4.1.2及以上

代码

@ContextConfiguration(classes =SpringConfiguration.class)
@RunWith(SpringJUnit4ClassRunner.class)
public class AccountServiceTest {    
    @Autowired   
    private IAccountService as;    
    @Test    
    public void testfindAll(){         
    List<Account>accounts=as.findAllAccount();        
    for(Account account:accounts){            
    System.out.println(account);        
    }    
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值