普通类中调用service注解类中的方法

本文详细介绍如何在Spring框架中整合MyBatis,包括配置数据源、创建SqlSessionFactory及使用SqlSessionTemplate进行数据库操作的过程。

1,applicationContext.xml配置文件中:

    sqlSession配置:

     <bean id="sqlSession"  class="org.mybatis.spring.SqlSessionTemplate">   
<constructor-arg index="0" ref="sqlSessionFactory" />  

    </bean> 

    sqlSessionFactory配置:

    <!-- 创建SqlSessionFactory,同时指定数据源 -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
   <property name="dataSource" ref="dataSource" />

   <property name="configLocation">  

        <!-- 指定mybaties路径 --!>

            <value>classpath:com/mer/sqlmapper/sqlMapConfig.xml</value>  
        </property>  

</bean>

    dataSource数据源配置:

    <!--创建jdbc数据源 -->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="${driver}" />
<property name="url" value="${url}" />
<property name="username" value="${username}" />
<property name="password" value="${password}" />

<!-- 连接池中可同时连接的最大的连接数 -->
<property name="maxActive" value="20" />
<!-- 最大建立连接等待时间。如果超过此时间将接到异常。设为-1表示无限制。单位是毫秒 -->
<property name="maxWait" value="20000"></property>
<!-- validationQuery是用来验证数据库连接的查询语句,这个查询语句必须是至少返回一条数据的SELECT语句。 -->
<property name="validationQuery" value="SELECT 1" />
<!-- 指明是否在从池中取出连接前进行检验,如果检验失败,则从池中去除连接并尝试取出另一个. -->
  <property name="testOnBorrow" value="true"/>
  <!-- 指明连接是否被空闲连接回收器(如果有)进行检验.如果检测失败,则连接将被从池中去除.  -->
  <property name="testWhileIdle" value="true"></property>
<!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 -->
<property name="timeBetweenEvictionRunsMillis" value="3600000"></property>
<!-- 配置一个连接在池中最小生存的时间,单位是毫秒 -->
<property name="minEvictableIdleTimeMillis" value="120000"></property>
<!--  在每次空闲连接回收器线程(如果有)运行时检查的连接数量 -->  
<property name="numTestsPerEvictionRun" value="50"></property>
<!--removeAbandoned: 是否自动回收超时连接-->    
<property name="removeAbandoned" value="true"/>
<!--removeAbandonedTimeout: 超时时间(以秒数为单位)-->
<property name="removeAbandonedTimeout" value="600"/>

</bean>

2,普通类中进行调用:

        //普通类中调用service层服务
protected WebApplicationContext wac = ContextLoader.getCurrentWebApplicationContext();  
protected SqlSessionTemplate sql=(SqlSessionTemplate)wac.getBean("sqlSession");
protected SqlSession sqlSession=null;

private static final String sqlSpaceName="Push";        //要调用的注解方法

       /**
* ********************************************************
* @Title: getSqlName
* @Description: TODO(获取执行SQL所需要的格式: 命令空间.SQLID)
* @param sqlId
* @return String
* @date 2014-11-4 下午03:37:14
********************************************************
*/
public String getSqlName(String sqlId){

return sqlSpaceName+"."+sqlId;

        }

        /**
* ********************************************************
* @Title: getSession
* @Description: TODO(获取sqlSession并打开)
* @return SqlSession
* @date 2014-11-4 下午03:15:19
********************************************************
*/
public SqlSession getSession(){
this.sqlSession=sql.getSqlSessionFactory().openSession();
return sqlSession;

}

        /**
* ********************************************************
* @Title: closeSession
* @Description: TODO(关闭数据连接) void
* @date 2014-11-4 下午03:19:35
********************************************************
*/
public void closeSession(){
sqlSession.close();
}

        。。。。。。

        //方法中进行调用

        Push ph = (Push)getSession().selectOne(getSqlName("getOne"), map);

        。。。。。。

        关闭session连接

        //关闭session
closeSession();


<think>好的,我现在需要帮助用户理解在Java Spring中如何通过@Component注解定义的被其他组件调用。首先,我需要回忆一下Spring框架的基本概念,尤其是依赖注入和组件扫描的相关知识。 用户的问题是关于@Component注解的如何被其他组件调用的,所以我应该从组件扫描开始讲起。因为Spring通过组件扫描来发现带有@Component及其衍生注解的,并将它们注册为Bean。接下来,可能需要解释如何通过自动装配(@Autowired)来注入这些Bean,或者使用构造函数注入等其他方式。 然后,我需要考虑不同的场景,比如在同一个包结构下和非同包的情况,这时候可能需要调整组件扫描的路径。用户可能不清楚如何配置包扫描,所以需要提到@ComponentScan注解的使用方法,以及默认情况下Spring Boot的扫描规则。 另外,用户可能会想知道如何显式地获取Bean,比如通过ApplicationContext或者像他们提供的代码中的GetBeanUtil工具。虽然这不是推荐的做法,但有时候在非Spring管理的中可能需要这样使用,所以需要解释一下。 还要注意引用提供的资料,特别是引用[1]和引用[4]中的内容,它们提到了@Component的基本用法和如何通过工具获取Bean的实例。需要确保在回答中正确引用这些内容,并符合用户要求的引用格式。 此外,用户可能对Bean的作用域或名称指定有疑问,比如如何通过@Component("beanName")来指定Bean的名称,这样在注入时可以使用@Qualifier来指定具体的Bean。这部分内容可能对高级使用有帮助,也应该涵盖进去。 最后,生成的相关问题需要围绕用户可能的后续疑问,比如如何解决注入失败、Bean的作用域影响,或者如何配置组件扫描路径等。这些问题应该能够帮助用户进一步理解和解决可能遇到的问题。 总结一下,回答的结构应该包括组件扫描、依赖注入的不同方法、显式获取Bean的方式,以及相关的配置和注意事项,同时引用提供的资料来支持回答的正确性。</think>### 如何调用通过`@Component`注解定义的 在Spring框架中,通过`@Component`注解定义的会被Spring容器管理为Bean,其他组件可以通过**依赖注入**或**显式获取Bean**的方式调用它们。以下是具体实现方法: --- #### 1. **依赖注入(推荐方式)** 通过`@Autowired`或构造函数注入,Spring会自动将Bean实例注入到目标组件中。 ##### 示例代码: ```java @Component public class MyComponent { public void doSomething() { System.out.println("Component method called"); } } @Service public class MyService { @Autowired // 自动注入MyComponent实例 private MyComponent myComponent; public void execute() { myComponent.doSomething(); // 直接调用 } } ``` **说明**: - `@Autowired`默认按型匹配,如果存在多个同型的Bean,需配合`@Qualifier("beanName")`指定名称[^1]。 - 也可使用构造函数注入(Spring推荐方式): ```java @Service public class MyService { private final MyComponent myComponent; public MyService(MyComponent myComponent) { this.myComponent = myComponent; } } ``` --- #### 2. **显式获取Bean(非推荐,特殊场景使用)** 在非Spring管理的普通类中,可通过`ApplicationContext`或工具获取Bean实例[^4]。 ##### 示例代码: ```java // 工具(需提前注册到Spring容器) @Component public class GetBeanUtil implements ApplicationContextAware { private static ApplicationContext context; @Override public void setApplicationContext(ApplicationContext ctx) { context = ctx; } public static <T> T getBean(Class<T> beanClass) { return context.getBean(beanClass); } } // 普通类调用 public class OrdinaryClass { public void callComponent() { MyComponent component = GetBeanUtil.getBean(MyComponent.class); component.doSomething(); } } ``` **注意事项**: - 显式获取Bean破坏了依赖注入的设计原则,仅在无法使用注入时使用(如工具、静态方法)。 --- #### 3. **组件扫描配置** 确保被调用的`@Component`位于Spring的扫描路径下: - **默认扫描规则**:Spring Boot会自动扫描主所在包及其子包。 - **自定义扫描路径**:通过`@ComponentScan`指定包路径[^3]。 ```java @SpringBootApplication @ComponentScan({"com.example.components", "com.example.services"}) public class Application { ... } ``` --- #### 4. **Bean名称冲突处理** 若存在多个同型Bean,可通过`@Component("customName")`指定名称,并在注入时使用`@Qualifier`: ```java @Component("componentA") public class MyComponentA implements MyInterface { ... } @Component("componentB") public class MyComponentB implements MyInterface { ... } @Service public class MyService { @Autowired @Qualifier("componentA") private MyInterface component; } ``` --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值