Spring是怎么根据接口获取实现类的?

动态代理 不是要知道实现类和接口才能创建出代理对象吗?
引用Autowired注解注入service时都是写的接口,spring是怎么找到接口的实现类的?
是扫包时记录了依赖关系还是什么别的方法?

2个回答

在启动spring IoC时,容器自动装载了一个AutowiredAnnotationBeanPostProcessor后置处理器,当容器扫描到@Autowied、@Resource或@Inject时,就会在IoC容器自动查找需要的bean,并装配给该对象的属性。
另外关于Autowied的原理还有很多,我说的也就是它的大概原理,详细的你可以去谷歌哈。

qq_34872748
L星火燎原 提前扫包的时候记录了类和接口的实现关系
大约一年之前 回复
hailowell
纵马饮白虹 是提前扫包的时候记录了类和接口的实现关系还是用到时再找?
大约一年之前 回复
hailowell
纵马饮白虹 自动查找需要的bean 能说下这一步的思路吗?spring是怎么根据接口自动找到相应的实现类的?
大约一年之前 回复

扫包一般写到接口那层包,因为实现类的包是再接口包里,扫描机制是扫描当前包以及下面的所有子包

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
spring DI @Autowired标记在接口上面获取该接口实现类的问题
Spring的DI ,@Autowired标记在一个接口上面 ,会通过寻找@Component注解找到该接口的实现类,但是 假如该接口有多个实现类呢 ,该寻找哪一个实现类呢?
new的对象中获取spring中的bean类报applicationContext为null
我是使用实现ApplicationContextAware接口封装一个工具类来初始化一个applicationContext来使用的,项目启动是也看到初始化成功了,applicationContext是有值的,但在new的对象中使用时却报null?不知道为什么,请大神指点,下面是代码实现: ```@Component public class BeanContext implements ApplicationContextAware { private static ApplicationContext applicationContext; public static ApplicationContext getApplicationContext(){ return applicationContext; } @SuppressWarnings("unchecked") public static <T> T getBean(String name) throws BeansException { return (T)applicationContext.getBean(name); } public static <T> T getBean(Class<T> clz) throws BeansException { return applicationContext.getBean(clz); } @Override public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { BeanContext.applicationContext = applicationContext; } } ``` public class SyncDataTask extends AbstractTask { private SyncDataParameters syncDataParameters; private Job job; private DataSource dataSource; private BaseDataSource baseDataSource; /** * task dir */ private String taskDir; private ShellCommandExecutor shellCommandExecutor; /** * process database access */ private ProcessDao processDao; private DataxJsonUtil dataxUtil = BeanContext.getBean(DataxJsonUtil.class); } ``` beanContext类上是有component注解的,syncDataTask是普通的类,没有交给spring管理,DataxJsonUtil是spring管理的类
spring mvc整合mybatis 为什么不把mapper接口类直接注入Controller呢
# spring mvc整合mybatis 为什么不把mapper接口类直接注入Controller呢? 正常开发如下: 1、mapper.xml,mapper接口类,service接口,serviceImpl实现类,Controller控制类 2、serviceImpl实现类注入mapper接口类,在Controller控制类中注入service接口 ## 问题1、为什么不直接把mapper接口类注入到Controller控制类中应用呢? ## 问题2:或者设计一个公用执行方法类,该类实现applicationContextAware接口,然后直接在spring容器中获取已经实例化的mapper接口,通过反射原理执行该接口的某个指定方法。最后在controller类中的方法里直接调用该类执行由前端传进来的方法名 请问各位大神这两种情况有什么影响呢?
Spring中通过ApplicationContextAware的实现类获得的ApplicationContext是线程安全的吗?
项目中我需要根据登陆用户动态修改Spring的数据源配置,即通过实现ApplicationContextAware接口来获取ApplicationContext,并将用户对应的数据源bean覆盖这个ApplicationContext的数据源bean。在多线程的情况下,是否会发生同步问题?Spring是否做到了每个线程持有独立的一份ApplicationContext,或者说我通过实现ApplicationContextAware而获得的ApplicationContext是否经过了ThreadLocal的封装优化?
SpringBoot项目中加入spring session后每次请求接口获取到的sessionId都不一致是什么请款
我在项目中按照这个方法: https://www.cnblogs.com/yanggb/p/10886520.html 加入spring session想实现session的共享,但是我现在不跨域访问,每次请求接口的时候获取到的sessionId都不一致是什么原因导致的呢? 后来我把下面这两段代码注释掉请求获取到的sessionId就一样了 ``` package com.test.common.config; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.data.redis.connection.RedisConnectionFactory; import org.springframework.data.redis.connection.RedisStandaloneConfiguration; import org.springframework.data.redis.connection.jedis.JedisConnectionFactory; import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.session.data.redis.config.annotation.web.http.EnableRedisHttpSession; @EnableRedisHttpSession(maxInactiveIntervalInSeconds = 3600) public class SessionConfig { @Value("${redis.hostname:localhost}") private String hostName; @Value("${redis.port:6379}") private int port; // @Value("${redis.password}") // private String password; @Bean public JedisConnectionFactory jedisConnectionFactory(){ RedisStandaloneConfiguration redisStandaloneConfiguration=new RedisStandaloneConfiguration(); redisStandaloneConfiguration.setHostName(hostName); redisStandaloneConfiguration.setPort(port); // redisStandaloneConfiguration.setPassword(password); redisStandaloneConfiguration.setDatabase(0); return new JedisConnectionFactory(redisStandaloneConfiguration); } @Bean public StringRedisTemplate redisTemplate(RedisConnectionFactory redisConnectionFactory){ return new StringRedisTemplate(redisConnectionFactory); } } ``` ``` package com.test.user.config; import com.test.common.config.SessionConfig; import org.springframework.session.web.context.AbstractHttpSessionApplicationInitializer; public class RedisSessionInitializer extends AbstractHttpSessionApplicationInitializer { public RedisSessionInitializer(){ super(SessionConfig.class); } } ``` 问题出在哪里啊~ 下面是我后台打印的日志: ![图片说明](https://img-ask.csdn.net/upload/201911/08/1573199256_608561.png)
spring+mybatis发布webservice接口问题
用spring+mybatis写的一个web项目,bean的管理是通过spring自动注入实现,在项目中可以实现对持久层dao的操作,并且@Transactional事物管理有效,但是将接口发布成webservice接口(用eclipse自带jax-ws实现),接口发布成功,但是在调用方法的候webservice获取不到spring注入的bean。 换一种方式(方式2),将接口中需要的bean,通过ApplicationContext getbean()获取bean实例,然后在发布webservice接口,能够实现对持久层dao的操作,但是事物失效这个问题有什么解决方案。 问题一:webservice怎么能实现spring注入的bean不为空。 问题二:用getBean的方式(方式2)发布的webservice怎么解决事物失效问题。
关于spring security3中密码获取的问题
我在配置spring security3中,有一个非常困惑的问题。 在登录页面,基于 /j_spring_security_check 的登录后,继承UserDetailsService接口,并且实现函数loadByUserName(String username)。 我要问的是,我如何取得密码?传递进来的只是一个帐户,没有密码。 还是我对登录这块理解错误?望指教。
Spring集成mybaties,用配置文件将映射器接口注入业务层,无法代理生成实现类
Spring集成mybaties,用配置文件将映射器接口注入业务层,做单元测试时,控制层可以正常返回数据,但是部署到tomcat上,启动就报错,信息如下。 1. 单元测试时正常返回数据 ![图片说明](https://img-ask.csdn.net/upload/201711/25/1511544455_147942.png) 2.部署到tomcat 启动报错 严重: Context initialization failed org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping': Invocation of init method failed; nested exception is org.springframework.beans.factory.CannotLoadBeanClassException: Cannot find class [com.alibaba.druid.pool.DruidDataSource] for bean with name 'dataSource' defined in file [G:\IdeaProjects\firstSpring\target\firstSpring\WEB-INF\classes\spring-mybatis.xml]; nested exception is java.lang.ClassNotFoundException: com.alibaba.druid.pool.DruidDataSource Related cause: org.springframework.beans.factory.CannotLoadBeanClassException: Cannot find class [com.alibaba.druid.pool.DruidDataSource] for bean with name 'dataSource' defined in file [G:\IdeaProjects\firstSpring\target\firstSpring\WEB-INF\classes\spring-mybatis.xml]; nested exception is java.lang.ClassNotFoundException: com.alibaba.druid.pool.DruidDataSource Related cause: org.springframework.beans.factory.CannotLoadBeanClassException: Cannot find class [org.mybatis.spring.SqlSessionFactoryBean] for bean with name 'sqlSessionFactory' defined in file [G:\IdeaProjects\firstSpring\target\firstSpring\WEB-INF\classes\spring-mybatis.xml]; nested exception is java.lang.ClassNotFoundException: org.mybatis.spring.SqlSessionFactoryBean Related cause: org.springframework.beans.factory.CannotLoadBeanClassException: Cannot find class [org.mybatis.spring.mapper.MapperScannerConfigurer] for bean with name 'org.mybatis.spring.mapper.MapperScannerConfigurer#0' defined in file [G:\IdeaProjects\firstSpring\target\firstSpring\WEB-INF\classes\spring-mybatis.xml]; nested exception is java.lang.ClassNotFoundException: org.mybatis.spring.mapper.MapperScannerConfigurer Caused by: java.lang.ClassNotFoundException: org.mybatis.spring.mapper.MapperScannerConfigurer at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1892) at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1735) at org.springframework.util.ClassUtils.forName(ClassUtils.java:250) at org.springframework.beans.factory.support.AbstractBeanDefinition.resolveBeanClass(AbstractBeanDefinition.java:401) at org.springframework.beans.factory.support.AbstractBeanFactory.doResolveBeanClass(AbstractBeanFactory.java:1432) at org.springframework.beans.factory.support.AbstractBeanFactory.resolveBeanClass(AbstractBeanFactory.java:1377) ... 81 more 3. 配置文件 spring-mvc ![图片说明](https://img-ask.csdn.net/upload/201711/25/1511544595_915527.png) Spring-mybatis ``` <util:properties id="cfg" location="classpath:config.properties"/> <!--配置DruidDataSource连接池 --> <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" destroy-method="close" init-method="init" lazy-init="true"> <property name="driverClassName" value="#{cfg.driver}" /> <property name="url" value="#{cfg.url}" /> <property name="username" value="#{cfg.username}" /> <property name="password" value="#{cfg.password}" /> <!-- 初始化连接大小 --> <property name="initialSize" value="#{cfg.initialSize}" /> <!-- 连接池最大数量 --> <property name="maxActive" value="#{cfg.maxActive}" /> <!-- 连接池最小空闲 --> <property name="minIdle" value="#{cfg.minIdle}" /> <!-- 获取连接最大等待时间 --> <property name="maxWait" value="#{cfg.maxWait}" /> </bean> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource"></property> <property name="configLocation" value="classpath:mybatis-config.xml"></property> <!-- 自动扫描mapping.xml文件 --> <property name="mapperLocations" > <list> <value>classpath:mapper/*.xml</value> </list> </property> </bean> <!-- Mapper接口所在包,Spring会自动查找其下的Mapper --> <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory" /> <property name="basePackage" value="rush.dao"/> </bean> ``` 4. 另外,在将映射器注入到业务层时,提示: ![图片说明](https://img-ask.csdn.net/upload/201711/25/1511544722_931225.png) 困惑,求大神帮忙解答,谢谢!
想把Spring的AOP应用到项目中去,主要想记录用户的一些行为,有些疑问想请教一下,谢谢!
1、项目中很多类都是用NEW的方式实例化的,这样的有没有办法把SPRING用起来? 比如经常是这样用的: ApplicationContext context = new ClassPathXmlApplicationContext("beans-config.xml"); MessageSender sender = (MessageSender)context.getBean("messageSender"); 上面是通过SPRING来获取实例的,有没有办法用NEW生成的也可以用AOP 2、很多类和很多方法都没有用接口的方法,想基于XML Schema的设置,采用这种方式Advice将不用实现特定的接口?
spring纯注解配置使用jdbcTemplate,无法获取spring容器中的bean
![这里是我dataSource的配置](https://img-ask.csdn.net/upload/201706/26/1498463533_601184.png) ![这是实现HomeDao接口的一个类](https://img-ask.csdn.net/upload/201706/26/1498463251_920085.png) ![这是出现的错误,我发现dataSrource和jdbcTemplate全部都是null,但是确实执行了DataSource配置的代码类。](https://img-ask.csdn.net/upload/201706/26/1498463294_32354.png)
请为我点拨Spring容器扩展点
在看Spring的容器扩展点一章,有点不明白了。 [color=blue]1.Spring框架的Ioc容器被设计为可扩展的。通常我们不需要子类化各个BeanFactory或ApplicationContext实现类。[/color] 这里的子类话什么意思?难道是继承他?然后扩展? [color=blue]2.一般都是通过plugin各种集成接口实现来进行扩展。[/color] 这个“插件”的集成来扩展,能举例说下具体应用在哪里吗? [color=blue]3.用BeanPostProcessor定制bean?[/color] 这个什么意思?我们获取Spring配置文件中的“元数据”(Spring里术语叫元数据,其实就是我们配置的类对象)都是通过ApplicationContext去获取就好了。WEB应用中配置web.xml就OK了,还用这个去定制bean做什么?这里的定制是什么含义?
struts2+spring整合后Action实现SessionAware后获取不到Session
<p>以下是Action实现的方法,下面只是贴出了Action的实现,代码测试过没问题,但只要运行到设置Session的地方就通不过,但也不报错,通过检测发现设置session时通过IOC方式注入的map形式的session未获取到,也就是getSession得到的是null,所以程序执行不了,看看哪位能看出下面程序问题的指点一下,我找了两天了,对照struts2中的示例也没发现哪里有问题,在此先谢谢了!</p> <p>public class ManagerAction extends ActionSupport implements SessionAware{ <br>IGxManagerService gxManagerService=null; <br><br> private String username = null; <br><br>private String password = null; <br><br>private Map session; <br><br>public void setSession(Map value) {//实现SessionAware中的setSession方法,通过IOC方式注入Session <br>session = value; <br>} <br><br><span style="color: #0000ff;">public Map getSession() { //获取map形式的session集合<br>return session; <br>}</span> <br><br>         public String getUsername() { <br>return username; <br>} <br><br>public void setUsername(String username) { <br>this.username = username; <br>} <br><br>public String getPassword() { <br>return password; <br>} <br><br>public void setPassword(String password) { <br>this.password = password; <br>} <br>public GxManager getManagerSessionInfo() { <br>return (GxManager) getSession().get(WebConstants.WEB_MANAGER_KEY); <br>} <br><br>/** <br>* &lt;p&gt; <br>* Store new reference to GxManager Object. <br>* &lt;/p&gt; <br>* <br>* @param GxManager <br>*            GxManager object for authenticated GxManager <br>*/ <br>public void setManagerSessionInfo(GxManager gxManger) { <br>getSession().put(WebConstants.WEB_MANAGER_KEY, gxManger); <br>} <br>public IGxManagerService getGxManagerService() { <br>return gxManagerService; <br>} <br><br>public void setGxManagerService(IGxManagerService gxManagerService) { <br>this.gxManagerService = gxManagerService; <br>} <br><br>public String login() { <br>GxManager gxManager = null; <br>try { <br>gxManager = gxManagerService.checkLogin(getUsername(),getPassword()); <br>} catch (Exception e) { <br>// TODO Auto-generated catch block <br>e.printStackTrace(); <br>} <br>if (gxManager != null) { <br><span style="color: #ff0000;">setManagerSessionInfo(gxManager);</span><span style="color: #ff0000;"> //此处出现问题,检测的结果是调用上面蓝色的getSession时获取到的值为NULL</span><br>} <br>if (hasErrors()) { <br>                      return INPUT; <br>                   } <br>return SUCCESS; <br>} <br><br>}</p> <p> </p><br /><strong>问题补充:</strong><br />配置文件都应该是没问题的,因为只要我把setManagerSessionInfo(gxManager)这一句注释掉程序就可以正常执行的<br /><strong>问题补充:</strong><br />下面这个是spring的配置文件 <br />&lt;bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"&gt; <br /> &lt;property name="driverClassName" value="com.mysql.jdbc.Driver"&gt; <br /> &lt;/property&gt; <br /> &lt;property name="url" value="jdbc:mysql://localhost:3306/test"&gt;&lt;/property&gt; <br /> &lt;property name="username" value="root"&gt;&lt;/property&gt; <br /> &lt;property name="password" value="root"&gt;&lt;/property&gt; <br /> &lt;/bean&gt; <br /> <br /> &lt;bean id="sessionFactory" <br /> class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"&gt; <br /> &lt;property name="dataSource"&gt; <br /> &lt;ref bean="dataSource" /&gt; <br /> &lt;/property&gt; <br /> &lt;property name="hibernateProperties"&gt; <br /> &lt;props&gt; <br /> &lt;prop key="hibernate.dialect"&gt; <br /> org.hibernate.dialect.MySQLDialect <br /> &lt;/prop&gt; <br /> &lt;prop key="hibernate.show_sql"&gt;false&lt;/prop&gt; <br /> &lt;/props&gt; <br /> &lt;/property&gt; <br /> &lt;property name="mappingResources"&gt; <br /> &lt;list&gt; <br /> &lt;value&gt;com/gx/entity/member/GxUserinfo.hbm.xml&lt;/value&gt; <br /> &lt;value&gt;com/gx/entity/GxManager.hbm.xml&lt;/value&gt;&lt;/list&gt; <br /> &lt;/property&gt; <br /> &lt;/bean&gt; <br /> &lt;bean id="myTransactionManager" <br /> class="org.springframework.orm.hibernate3.HibernateTransactionManager"&gt; <br /> &lt;property name="sessionFactory"&gt; <br /> &lt;ref local="sessionFactory" /&gt; <br /> &lt;/property&gt; <br /> &lt;/bean&gt; <br /> <br /> &lt;bean id="transationInterceptor" <br /> class="org.springframework.transaction.interceptor.TransactionInterceptor"&gt; <br /> &lt;property name="transactionManager" ref="myTransactionManager" /&gt; <br /> &lt;property name="transactionAttributes"&gt; <br /> &lt;props&gt; <br /> &lt;prop key="save*"&gt;PROPAGATION_REQUIRED&lt;/prop&gt; <br /> &lt;prop key="update*"&gt;PROPAGATION_REQUIRED&lt;/prop&gt; <br /> &lt;prop key="delete*"&gt;PROPAGATION_REQUIRED&lt;/prop&gt; <br /> &lt;prop key="Save*"&gt;PROPAGATION_REQUIRED&lt;/prop&gt; <br /> &lt;prop key="merge*"&gt;PROPAGATION_REQUIRED&lt;/prop&gt; <br /> &lt;prop key="shield*"&gt;PROPAGATION_REQUIRED&lt;/prop&gt; <br /> &lt;/props&gt; <br /> &lt;/property&gt; <br /> <br /> &lt;/bean&gt; <br /> <br /> &lt;bean <br /> class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator"&gt; <br /> &lt;property name="beanNames"&gt; <br /> &lt;value&gt;*DAO,*Service,*Services&lt;/value&gt; <br /> &lt;/property&gt; <br /> &lt;property name="interceptorNames"&gt; <br /> &lt;list&gt; <br /> &lt;value&gt;transationInterceptor&lt;/value&gt; <br /> &lt;/list&gt; <br /> &lt;/property&gt; <br /> &lt;/bean&gt; <br />&nbsp;&nbsp;&nbsp; <br /> &lt;bean id="GxManagerDAO" class="com.gx.dao.imp.GxManagerDAO"&gt; <br /> &lt;property name="sessionFactory"&gt; <br /> &lt;ref bean="sessionFactory" /&gt; <br /> &lt;/property&gt; <br /> &lt;/bean&gt; <br /> &lt;bean id="GxManagerService" class="com.gx.service.imp.GxManagerService"&gt; <br /> &nbsp;&nbsp;&nbsp; &lt;property name="gxManagerDAO"&gt; <br /> &lt;ref bean="GxManagerDAO" /&gt; <br /> &lt;/property&gt; <br /> &lt;/bean&gt; <br /> &lt;bean id="ManagerAction" class="com.gx.web.action.ManagerAction"&gt; <br /> &nbsp;&nbsp;&nbsp; &lt;property name="gxManagerService"&gt; <br /> &lt;ref bean="GxManagerService" /&gt; <br /> &lt;/property&gt; <br /> &lt;/bean&gt; <br /> &lt;/beans&gt;<br /><strong>问题补充:</strong><br />public class ManagerAction extends ActionSupport implements SessionAware <br />方法中已经实现了SessionAware接口,session应该是由struts2中的IOC方式自动注入的,应该不需要通过spring进行注入才是的!<br /><strong>问题补充:</strong><br />那应该怎么注入呢,因为如果只单独使用struts2上面的方式是可以获取到session的,因为上面是struts2中所说的通过实现sessionAware以IOC的方式获取struts2中封闭的map形式的底层session集合,上面之所以得不到,应该是由于struts2整合了spring的原因,但具体在spring中如何注入就不知道怎么做了!
Spring的 @Component("xxx")和@Qualifier(“xxx”)的区别
当一个接口有多个实现类时,就无法使用@AutoWired放在此接口上面了,需要对某个实现类创建唯一的标识符,就是在对应实现类上面添加Qualifier(“xxx”)然后同样在@AutoWired下添加Qualifier(“xxx”)就能对应起来,获取到那个对应的实现类的bean了,可是@Component("xxx")不就是为实现类bean创建唯一标识符的么(也就是id),为什么要多此一举,还要在实现类上添加Qualifier(“xxx”)呢? 直接写成@Component("xxx")可以吗?
spring cloud config刷新client配置问题
如题: 我们都知道,spring cloud config消息总线分服务端(简称server)和客户端(简称client),如果我们要对client的一些配置信息做修改时,只需要在git上修改对应client的配置文件,然后使用Post方式调用server的/bus/refresh?destinace=clientName:clientPort即可达到热更新的效果,但是我在使用过程中发现,并非client的所有配置都可以使用这样的方式进行热更新,所以,到底可以更新client的哪些配置我目前还是迷糊中的。 我现在有一个demo,server的配置文件或者我配置的是git,client的环境有两个版本,一个是开发版,即dev,还有一个是测试版本,即test,这两个版本中,其中有一个配置不一样,那就是数据库的连接,开发版本有开发数据库,测试版本有测试数据库,所以我希望使用spring cloud config server来进行client的数据库配置更新,client项目中只一个bootstrap.yml文件,里面只配置了eureka,zipkin,config的相关信息,这部分是不会变的,client的数据库配置和其他配置是放在git上的,当我在git上修改了client的数据库配置,比如url,然后调用server的/bus/refresh接口,观察到client确实是刷新了spring.datasource.url信息,项目本身没有报错,但是当我通过client的接口获取数据库名的时候,发现获取到的还是refresh之前的数据库名,并非我在git上配置的数据库,配置jdbcTemplate是直接使用springboot默认的配置,没有手动申明druidDataSource和jdbcTemplate(经过测试就算手动配置也是一样的结果),我已经在dao层加入了@RefreshScope注解 请问各路大神,这个问题如何解决呢? 另外还有一个问题,我想把logback的配置文件也放到git上,然后通过server来refresh client的logback日志配置信息,这个又应该如何实现?
cxf3跟spring4整合,address怎么配成自动设置?
我现在生成的webService都需要在spring配置脚本里面添加服务,例如 <!-- jax-ws endpoint定义 --> <jaxws:endpoint id="userWebServiceEP" address="/UserService"> <jaxws:implementor ref="userWebService" /> </jaxws:endpoint> <!-- WebService的实现Bean定义 --> 现在就是想这些代码不需要配置。主要是这个address="/UserService" ,想改成自动的,就是在impl的服务类上面有个path ,然后通过spring扫描自动获取 如果有几千个服务 ,那这样配置是不可行的 ,有没有类似2.0版本的Jsr181HandlerMapping这样的代理配置。 只需要在服务接口上注解声明为@WebService即可 ,然后使用基本包扫描,只要有这样的注解就能访问 谢谢
Spring factoryBean加载 框架内部嵌套加载问题
各位大神,最近在研究spring框架bean加载过程,遇到一个棘手问题,我相信研究spring原理的大神肯定对这个问题有兴趣 我的项目框架是spring+rpc,配置文件方式注入bean,非注解 一部分bean是普通的serivce bean配置,spring内部走正常bean的加载过程,没有问题; 还有一部分是自定义标签,通过一个工厂类生成service的代理对象bean,作为消费者/生产者,这个工厂类实现了FactoryBean接口,spring内部走FactoryBean的加载过程 public class RemoteServiceFactory implements FactoryBean<Object>, BeanFactoryAware, InitializingBean { private static final Logger log = LoggerFactory.getLogger(RemoteServiceFactory.class);  public RemoteServiceFactory(Object bean, String path, int port) {   this.object = bean; // 自定义标签中配置的service bean的引用(ref属性,引用配置文件bean id)   this.path = path; // 生产者服务路径(和此问题无关)   this.port = port; // 生产者服务端口(和此问题无关)  }    public boolean isSingleton() {   return true;  }  public void afterPropertiesSet() throws Exception {    // 根据this.object创建相应的生产者/消费者代理对象,用于rpc  } } 问题分析,debug spring bean解析后的加载过程 1.spring对配置文件解析后,遍历所有的bean,进行一一实例化   AbstractApplicationContext:finishBeanFactoryInitialization()     内部调用beanFactory.preInstantiateSingletons();       DefaultListableBeanFactory:preInstantiateSingletons()         内部遍历beanNames,进行一一实例化 2.假如第一个bean是普通的service bean,在初始化时,会解析内部的依赖,然后遍历依赖参数,解析依赖   DefaultListableBeanFactory:doResolveDependency()     内部调用findAutowireCandidates()        内部调用BeanFactoryUtils.beanNamesForTypeIncludingAncestors()         内部调用lbf.getBeanNamesForType()           -> DefaultListableBeanFactory:doGetBeanNamesForType()   关键就在这里,doGetBeanNamesForType方法内部会遍历所有bean,去判断是否匹配上面的依赖参数的类型,   当遍历到实现FactoryBean的bean时,会实例化这个bean(因为FactoryBean只是代理,不是真正bean),然后又会解析factoryBean中真实bean中的依赖参数,   然后就又会走到这里,导致一直嵌套下去的加载过程   如果程序加载没有问题,则一切正常;一旦某个类加载失败(比如某个类注入的属性在properties中不存在),就会出现大量的异常信息抛出,   原因就是上面的嵌套加载,某个类加载抛出异常会一直抛出到嵌套的最顶层,每一层的异常信息都会积攒下来,最后爆发似的抛出   (每层的异常信息都是 当前这层bean的加载失败) 各位大神:   我一直感觉spring这样嵌套加载在设计上是不应该的,不理解为什么会这样,单纯匹配类型的话,不能通过其他方式获取FactoryBean中真实bean的类型吗?     为什么非要实例化它呢?有什么方法可以解决这个问题?
急求解决Spring security中认证后的UserDetailsService接口问题!
问题描述: 登录页面除开j_username和j_password,还有siteId参数,我如何才能在UserDetailsService的实现类里方法loadUserByUsername中获取到提交上来的siteId这个参数。
spring注入失败
最近想把以前的项目增加的service托给spring处理 [code="java"] <bean id="userBusiness" class="com.*.service.impl.UserBusinessImpl"> <property name="userDAL" ref="userDao"></property> </bean> <bean id="userDao" class="com.*.dao.impl.UserDALImpl"> </bean> [/code] UserDALImpl是原先先好的DAO层的类,有自己的查询数据库的一些实现.我现在只想把userDao注入到service层里面处理 [code="java"] UserBusinessImpl private UserDAL userDAL; public void setUserDAL(UserDAL userDAL) { this.userDAL = userDAL; } [/code] 感觉就是简单的注入,还是失败. spring不熟,各位指点下. [b]问题补充:[/b] *号是我项目的 名称,我没写出来,其实是有路径的 UserDALImpl是实现UserDAL 接口 [b]问题补充:[/b] 没有报错信息. 只是在执行 [code="java"] UserBusinessImpl.java private UserDAL userDAL; public void setUserDAL(UserDAL userDAL) { this.userDAL = userDAL; } public Person getUserFromEXTNO(String extNo) throws Exception { return userDAL.getUserFromEXTNO(extNo); } [/code] [code="java"] public class UserDALImpl extends BaseDAL implements UserDAL { // 初始化Log private Logger logger = Logger.getLogger(UserDALImpl.class); public UserDALImpl() throws Exception { } public Person getUserFromEXTNO(String extNo) throws Exception { 执行SQL } [/code] spring配置文件就这2个 [code="java"] <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd"> <bean id="userBusiness" class="com.ccsee.happytrip.service.impl.UserBusinessImpl"> <property name="userDAL" ref="userDao"></property> </bean> <bean id="userDao" class="com.ccsee.happytrip.dao.impl.UserDALImpl"> </bean> </beans> [/code] 报的异常是在执行getUserFromEXTNO方法时候抛空指针,也就是注入失败,没把dao注入到service层中 [b]问题补充:[/b] [code="java"] UserDALImpl对象看看调用时是不是new的呢?? 如果是那就肯定错了 UserDALImpl 也得用spring注入 或者用applicationConexst.getbean取[/code] UserDALImpl对象我是打算把他注入到UserBusinessImpl中去的,在UserBusinessImpl中是用set接口进去的 至于UserDALImpl本身有自己的JDBC连接池以及一系列的操作. [b]问题补充:[/b] [code="java"] 不对吧 你是已经从bean工程里取出来了 然后执行dao的方法时候报的错么? 如果取出来了 就证明你配置没错 。。。。。你把堆栈信息贴过来 我看看是在哪掉用的时候出的空指针 [/code] 配置文件的写法应该是对的,服务器启动正常, 但是没有注入成功.在执行到UserBusinessImpl的时候抛空指针, [2009-12-04 17:08:18,125]-ERROR (UserLoginAction.java:93)| java.lang.NullPointerException at com.ccsee.happytrip.service.impl.UserBusinessImpl.getUserFromEXTNO(Us erBusinessImpl.java:67) [b]问题补充:[/b] [code="java"] UserBusinessImpl 如果不是通过spring get的 后面的照样无法注入成功 听我的试一下 我过去带的人就有这么错的 估计你的问题也是这个[/code] 没有明白你所说的spring get的 按我的理解就是,在action层,也使用同样的set注入.如果是这样的话,我有尝试过,但是是失败的,也是空指针,只不是报在action层了,也就是注入失败. [b]问题补充:[/b] [quote] 的确是没有获得到dao 你获得UserBusinessImpl 的方式应该不对吧 你是如何获得UserBusinessImpl 的? 那句代码贴出来看看 [/quote] UserBusiness business = new UserBusinessImpl(); 我是直接new的,我也尝试过像service层那样注入,一样没效果 [code="java"] 看你配置看不出有什么问题,有可能是DAO方法里某行报错了。 [/code] 应该还没到dao层,dao层的LOG都没打出来,应该就属于注入失败. [b]问题补充:[/b] [quote] 你new ClassPathXmlApplicationContext()的这个过程就是对配置文件的解析 以及按着你所配置的方式通过反射机制自动给你进行装配 如果没有这个过程 你直接new那就相当于在堆内存上开辟一个空的对象 里面没有任何的东西 所以你取出的dao是空 因为你没往里放东西啊,而UserBusinessImpl userBusinessImpl = (UserManager)factory.getBean("UserBusinessImpl ");是从已经放着解析并且装配好的所有对象的大容器里去取 所以你取出来的是装配好的啊 [/quote] 我把UserBusinessImpl改了下就可以了, [code="java"] public Person getUserFromEXTNO(String extNo) throws Exception { BeanFactory factory = new ClassPathXmlApplicationContext("applicationContext.xml"); UserDAL userDal = (UserDAL)factory.getBean("userDao"); return userDal.getUserFromEXTNO(extNo); } [/code] 但是为什么使用set注入不行 [b]问题补充:[/b] 非常谢谢各位的解答 现在的结果是,我在action,service层使用getBean都可以获取到实例,但是使用set注入都是失败的. [code="java"] <bean name="/userLoginAction" class="com.ccsee.happytrip.web.action.UserLoginAction"> <property name="userBusiness" ref="userBusiness"></property> </bean> <bean id="userBusiness" class="com.ccsee.happytrip.service.impl.UserBusinessImpl"> <property name="userDAL" ref="userDao"></property> </bean> <bean id="userDao" class="com.ccsee.happytrip.dao.impl.UserDALImpl"> </bean> [/code] action层 [code="java"] private UserBusiness userBusiness; public void setUserBusiness(UserBusiness userBusiness) { this.userBusiness = userBusiness; } Person user = userBusiness.getUserFromEXTNO(form.getUserName() .trim()); [/code] 如果使用getBean就行,有朋友说必须都使用spring拖管就行了,我现在 action和service的都放在spring托管中,dao没办法托管必须用原来的. 我想问下原因,谢谢. [b]问题补充:[/b] 我的struts有加载spring strust-config.xml [code="java"] <plug-in className="org.springframework.web.struts.ContextLoaderPlugIn"> <set-property property="contextConfigLocation" value="/WEB-INF/applicationContext.xml" /> </plug-in> [/code]
context.getBean("PrivateItf.class")这个具体要怎么理解
有一接口 ``` public interface PrivateItf{ void sendMessage(String Message); } ``` 有一实现类 ``` public class PrivateImpl implements PrivateItf{ void sendMessage(String Message); } ``` 在springBeans.xml中用了 ``` <bean class="com.test.PrivateImpl"/> ``` 取配置文件调用方法 ``` lassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("META-INF/springBeans.xml"); PrivateItf privateImpl = context.getBean("PrivateItf.class"); privateImpl.sendMessage("test"); ``` 想向各位大佬请教一下,在获取配置 context.getBean的时候getBean里面参数是接口类,然后我xml中只配置了一个实现类bean,这个是怎么获取的 以前只学过getBean(String beanId)的形式获取,如果我有很多个PrivateImpl1,PrivateImpl2,PrivateImpl3....实现了PrivateItf这个接口,那取到的这个privateImpl到底是取那个具体的实现类呢?
Java学习的正确打开方式
在博主认为,对于入门级学习java的最佳学习方法莫过于视频+博客+书籍+总结,前三者博主将淋漓尽致地挥毫于这篇博客文章中,至于总结在于个人,实际上越到后面你会发现学习的最好方式就是阅读参考官方文档其次就是国内的书籍,博客次之,这又是一个层次了,这里暂时不提后面再谈。博主将为各位入门java保驾护航,各位只管冲鸭!!!上天是公平的,只要不辜负时间,时间自然不会辜负你。 何谓学习?博主所理解的学习,它是一个过程,是一个不断累积、不断沉淀、不断总结、善于传达自己的个人见解以及乐于分享的过程。
程序员必须掌握的核心算法有哪些?
由于我之前一直强调数据结构以及算法学习的重要性,所以就有一些读者经常问我,数据结构与算法应该要学习到哪个程度呢?,说实话,这个问题我不知道要怎么回答你,主要取决于你想学习到哪些程度,不过针对这个问题,我稍微总结一下我学过的算法知识点,以及我觉得值得学习的算法。这些算法与数据结构的学习大多数是零散的,并没有一本把他们全部覆盖的书籍。下面是我觉得值得学习的一些算法以及数据结构,当然,我也会整理一些看过...
前端 | 2. 正则
转载请注明以下: 本文转自清自以敬的博客:https://blog.csdn.net/qq_45791147 文章目录1.转义2.正则表达式初步2.1.匹配字符2.1.1.组成元素2.1.2.基础正则的设计 1.转义 转义的作用: 当某个字符在表达式中具有特殊含义,例如字符串引号中出现了引号,为了可以使用这些字符本身,而不是使用其在表达式中的特殊含义,则需要通过转义符“\”来构建该字符转义...
有哪些让程序员受益终生的建议
从业五年多,辗转两个大厂,出过书,创过业,从技术小白成长为基层管理,联合几个业内大牛回答下这个问题,希望能帮到大家,记得帮我点赞哦。 敲黑板!!!读了这篇文章,你将知道如何才能进大厂,如何实现财务自由,如何在工作中游刃有余,这篇文章很长,但绝对是精品,记得帮我点赞哦!!!! 一腔肺腑之言,能看进去多少,就看你自己了!!! 目录: 在校生篇: 为什么要尽量进大厂? 如何选择语言及方...
大学四年自学走来,这些私藏的实用工具/学习网站我贡献出来了
大学四年,看课本是不可能一直看课本的了,对于学习,特别是自学,善于搜索网上的一些资源来辅助,还是非常有必要的,下面我就把这几年私藏的各种资源,网站贡献出来给你们。主要有:电子书搜索、实用工具、在线视频学习网站、非视频学习网站、软件下载、面试/求职必备网站。 注意:文中提到的所有资源,文末我都给你整理好了,你们只管拿去,如果觉得不错,转发、分享就是最大的支持了。 一、电子书搜索 对于大部分程序员...
linux系列之常用运维命令整理笔录
本博客记录工作中需要的linux运维命令,大学时候开始接触linux,会一些基本操作,可是都没有整理起来,加上是做开发,不做运维,有些命令忘记了,所以现在整理成博客,当然vi,文件操作等就不介绍了,慢慢积累一些其它拓展的命令,博客不定时更新 free -m 其中:m表示兆,也可以用g,注意都要小写 Men:表示物理内存统计 total:表示物理内存总数(total=used+free) use...
比特币原理详解
一、什么是比特币 比特币是一种电子货币,是一种基于密码学的货币,在2008年11月1日由中本聪发表比特币白皮书,文中提出了一种去中心化的电子记账系统,我们平时的电子现金是银行来记账,因为银行的背后是国家信用。去中心化电子记账系统是参与者共同记账。比特币可以防止主权危机、信用风险。其好处不多做赘述,这一层面介绍的文章很多,本文主要从更深层的技术原理角度进行介绍。 二、问题引入 假设现有4个人...
程序员接私活怎样防止做完了不给钱?
首先跟大家说明一点,我们做 IT 类的外包开发,是非标品开发,所以很有可能在开发过程中会有这样那样的需求修改,而这种需求修改很容易造成扯皮,进而影响到费用支付,甚至出现做完了项目收不到钱的情况。 那么,怎么保证自己的薪酬安全呢? 我们在开工前,一定要做好一些证据方面的准备(也就是“讨薪”的理论依据),这其中最重要的就是需求文档和验收标准。一定要让需求方提供这两个文档资料作为开发的基础。之后开发...
网页实现一个简单的音乐播放器(大佬别看。(⊙﹏⊙))
今天闲着无事,就想写点东西。然后听了下歌,就打算写个播放器。 于是乎用h5 audio的加上js简单的播放器完工了。 演示地点演示 html代码如下` music 这个年纪 七月的风 音乐 ` 然后就是css`*{ margin: 0; padding: 0; text-decoration: none; list-...
Python十大装B语法
Python 是一种代表简单思想的语言,其语法相对简单,很容易上手。不过,如果就此小视 Python 语法的精妙和深邃,那就大错特错了。本文精心筛选了最能展现 Python 语法之精妙的十个知识点,并附上详细的实例代码。如能在实战中融会贯通、灵活使用,必将使代码更为精炼、高效,同时也会极大提升代码B格,使之看上去更老练,读起来更优雅。
数据库优化 - SQL优化
以实际SQL入手,带你一步一步走上SQL优化之路!
2019年11月中国大陆编程语言排行榜
2019年11月2日,我统计了某招聘网站,获得有效程序员招聘数据9万条。针对招聘信息,提取编程语言关键字,并统计如下: 编程语言比例 rank pl_ percentage 1 java 33.62% 2 cpp 16.42% 3 c_sharp 12.82% 4 javascript 12.31% 5 python 7.93% 6 go 7.25% 7 p...
通俗易懂地给女朋友讲:线程池的内部原理
餐盘在灯光的照耀下格外晶莹洁白,女朋友拿起红酒杯轻轻地抿了一小口,对我说:“经常听你说线程池,到底线程池到底是个什么原理?”
《奇巧淫技》系列-python!!每天早上八点自动发送天气预报邮件到QQ邮箱
将代码部署服务器,每日早上定时获取到天气数据,并发送到邮箱。 也可以说是一个小型人工智障。 知识可以运用在不同地方,不一定非是天气预报。
经典算法(5)杨辉三角
杨辉三角 是经典算法,这篇博客对它的算法思想进行了讲解,并有完整的代码实现。
腾讯算法面试题:64匹马8个跑道需要多少轮才能选出最快的四匹?
昨天,有网友私信我,说去阿里面试,彻底的被打击到了。问了为什么网上大量使用ThreadLocal的源码都会加上private static?他被难住了,因为他从来都没有考虑过这个问题。无独有偶,今天笔者又发现有网友吐槽了一道腾讯的面试题,我们一起来看看。 腾讯算法面试题:64匹马8个跑道需要多少轮才能选出最快的四匹? 在互联网职场论坛,一名程序员发帖求助到。二面腾讯,其中一个算法题:64匹...
面试官:你连RESTful都不知道我怎么敢要你?
干货,2019 RESTful最贱实践
Docker 从入门到掉坑
Docker 介绍 简单的对docker进行介绍,可以把它理解为一个应用程序执行的容器。但是docker本身和虚拟机还是有较为明显的出入的。我大致归纳了一下,可以总结为以下几点: docker自身也有着很多的优点,关于它的优点,可以总结为以下几项: 安装docker 从 2017 年 3 月开始 docker 在原来的基础上分为两个分支版本: Docker CE 和 Doc...
为啥国人偏爱Mybatis,而老外喜欢Hibernate/JPA呢?
关于SQL和ORM的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行了一番讨论,感触还是有一些,于是就有了今天这篇文。 声明:本文不会下关于Mybatis和JPA两个持久层框架哪个更好这样的结论。只是摆事实,讲道理,所以,请各位看官勿喷。 一、事件起因 关于Mybatis和JPA孰优孰劣的问题,争论已经很多年了。一直也没有结论,毕竟每个人的喜好和习惯是大不相同的。我也看...
白话阿里巴巴Java开发手册高级篇
不久前,阿里巴巴发布了《阿里巴巴Java开发手册》,总结了阿里巴巴内部实际项目开发过程中开发人员应该遵守的研发流程规范,这些流程规范在一定程度上能够保证最终的项目交付质量,通过在时间中总结模式,并推广给广大开发人员,来避免研发人员在实践中容易犯的错误,确保最终在大规模协作的项目中达成既定目标。 无独有偶,笔者去年在公司里负责升级和制定研发流程、设计模板、设计标准、代码标准等规范,并在实际工作中进行...
SQL-小白最佳入门sql查询一
不要偷偷的查询我的个人资料,即使你再喜欢我,也不要这样,真的不好;
项目中的if else太多了,该怎么重构?
介绍 最近跟着公司的大佬开发了一款IM系统,类似QQ和微信哈,就是聊天软件。我们有一部分业务逻辑是这样的 if (msgType = "文本") { // dosomething } else if(msgType = "图片") { // doshomething } else if(msgType = "视频") { // doshomething } else { // doshom...
Nginx 原理和架构
Nginx 是一个免费的,开源的,高性能的 HTTP 服务器和反向代理,以及 IMAP / POP3 代理服务器。Nginx 以其高性能,稳定性,丰富的功能,简单的配置和低资源消耗而闻名。 Nginx 的整体架构 Nginx 里有一个 master 进程和多个 worker 进程。master 进程并不处理网络请求,主要负责调度工作进程:加载配置、启动工作进程及非停升级。worker 进程负责处...
Python 编程开发 实用经验和技巧
Python是一门很灵活的语言,也有很多实用的方法,有时候实现一个功能可以用多种方法实现,我这里总结了一些常用的方法和技巧,包括小数保留指定位小数、判断变量的数据类型、类方法@classmethod、制表符中文对齐、遍历字典、datetime.timedelta的使用等,会持续更新......
YouTube排名第一的励志英文演讲《Dream(梦想)》
Idon’t know what that dream is that you have, I don't care how disappointing it might have been as you've been working toward that dream,but that dream that you’re holding in your mind, that it’s po...
“狗屁不通文章生成器”登顶GitHub热榜,分分钟写出万字形式主义大作
一、垃圾文字生成器介绍 最近在浏览GitHub的时候,发现了这样一个骨骼清奇的雷人项目,而且热度还特别高。 项目中文名:狗屁不通文章生成器 项目英文名:BullshitGenerator 根据作者的介绍,他是偶尔需要一些中文文字用于GUI开发时测试文本渲染,因此开发了这个废话生成器。但由于生成的废话实在是太过富于哲理,所以最近已经被小伙伴们给玩坏了。 他的文风可能是这样的: 你发现,...
程序员:我终于知道post和get的区别
是一个老生常谈的话题,然而随着不断的学习,对于以前的认识有很多误区,所以还是需要不断地总结的,学而时习之,不亦说乎
《程序人生》系列-这个程序员只用了20行代码就拿了冠军
你知道的越多,你不知道的越多 点赞再看,养成习惯GitHub上已经开源https://github.com/JavaFamily,有一线大厂面试点脑图,欢迎Star和完善 前言 这一期不算《吊打面试官》系列的,所有没前言我直接开始。 絮叨 本来应该是没有这期的,看过我上期的小伙伴应该是知道的嘛,双十一比较忙嘛,要值班又要去帮忙拍摄年会的视频素材,还得搞个程序员一天的Vlog,还要写BU...
程序员把地府后台管理系统做出来了,还有3.0版本!12月7号最新消息:已在开发中有github地址
第一幕:缘起 听说阎王爷要做个生死簿后台管理系统,我们派去了一个程序员…… 996程序员做的梦: 第一场:团队招募 为了应对地府管理危机,阎王打算找“人”开发一套地府后台管理系统,于是就在地府总经办群中发了项目需求。 话说还是中国电信的信号好,地府都是满格,哈哈!!! 经常会有外行朋友问:看某网站做的不错,功能也简单,你帮忙做一下? 而这次,面对这样的需求,这个程序员...
网易云6亿用户音乐推荐算法
网易云音乐是音乐爱好者的集聚地,云音乐推荐系统致力于通过 AI 算法的落地,实现用户千人千面的个性化推荐,为用户带来不一样的听歌体验。 本次分享重点介绍 AI 算法在音乐推荐中的应用实践,以及在算法落地过程中遇到的挑战和解决方案。 将从如下两个部分展开: AI算法在音乐推荐中的应用 音乐场景下的 AI 思考 从 2013 年 4 月正式上线至今,网易云音乐平台持续提供着:乐屏社区、UGC...
相关热词 c#委托 逆变与协变 c#新建一个项目 c#获取dll文件路径 c#子窗体调用主窗体事件 c# 拷贝目录 c# 调用cef 网页填表c#源代码 c#部署端口监听项目、 c#接口中的属性使用方法 c# 昨天
立即提问