spring 如何用注解的方式给普通类注入bean

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了spring 如何用注解的方式给普通类注入bean相关的知识,希望对你有一定的参考价值。

普通类为PersonTest
private PersonManager personManager ;


service层有一类
@Service("personManager")
public class PersonManagerImp implements PersonManager
//省略方法


如何将service 中的personManager 注入到 PersonTest 的 personManager 属性中

参考技术A 你在PersonTest 类里面声明一个变量,加上他的set和get方法;然后你在applicationContext.xml里面写
<bean name = "给你要注入的类起个名字 例如A" class = “你要注入类的路径”>
<property name="被注入的类里面 你刚声明的那个变量的名字" ref="A"></property>
</bean>
参考技术B @Service("personManager")是一个注解,spring在初始化的时候处理器会处理该注解!
注解中规定了service注解的操作:首先根据名字去bean.xml文件中找到名字相同的id进行
实例化,如果没有找到好像要找类型相同的(这个忘了),否则报异常!
参考技术C @Controller
PersonTest

@Autowired
private PersonManager personManager ;


service层有一类
@Service("personManager")
public class PersonManagerImp implements PersonManager
//省略方法


记得没错的话这样应该就可以了。追问

普通类,不是controller,这种注入,我知道的

spring 抽象类注入问题

我的basedao类是抽象父类 底下有很多实现类调用了父类的方法 在用spring注入的时候报错.错误就不贴了 大概的意思是不能实例化抽象类(我注入的是继承了的子类) 我就把abstract关键字给删了 里面的方法和字段还用的protected. 有没有什么影响???

说错了,sorry,LocalSessionFacoryBean不是实现sessionFactory的接口,这里想当然的以为sessionFactory是被 LocalSessionFacoryBean实现的,去研读了一下代码发现
LocalSessionFactoryBean继承了AbstractSessionFactoryBean这个抽象类,这个类实现了org.springframework.beans.factory.FactoryBean接口, spring在装配的时候, 如果发现实现了org.springframework.beans.factory.FactoryBean接口, 就会使用FactoryBean#getObject() 方法返回的对象装配,
这个抽象类两个重要的实现org.hibernate.SessionFactory的方法如下:
//在产生类实例后生成sessionFacotry实例,注入到这个类的sessionFactory中
public void afterPropertiesSet() throws Exception
SessionFactory rawSf = buildSessionFactory();
this.sessionFactory = wrapSessionFactoryIfNecessary(rawSf);

//因为实现FactoryBean接口这个类注入的时候通过getObject()注入的是sessionFactory组件,而不是这个LocalSessionFactoryBean的实例
public Object getObject()
return this.sessionFactory;


---------------------------------------------------------------------
楼主去研读一下sessionFactory的代码,其实里面都是空方法,为什么呢,因为他是个接口,你不结合Spring直接用 Hibernate的时候,sessionFactory用的都是SessionFacotryImpl类的实例(因为接口不能实例化)同理,org.springframework.orm.hibernate3.LocalSessionFactoryBean也是这个接口的实现所以可以注入到sessionFactory中
______________________问题分割线______________________________________

<property name="sessionFactory" ref="sessionFactory"/> 这个注入的不是自己的类org.springframework.orm.hibernate3.HibernateTransactionManager,而是自己类用到的组件LocalSessionFacoryBean
比如Class Person
private String head;

注入的是head而不是Person,但是其中Person的head是依赖你外面配置的head(sessionFactory)的,不知道我这样说楼主明白否
参考技术A 关系应该是这样的,你的实现类继承basedao抽像类并实现其方法.
在SPRING 注入的时候,要注入basedao抽像类的接口并不是basedao抽像类本身
你是不是没有建立basedao抽像类的接口,直接注入到basedao抽像类本身了.
参考技术B 在引用父类的地方,要对应写上实现类。不然无法根据父类引用来确定是哪个子类的对象。 参考技术C 代码如下:
public abstract class B implements A

private JdbcTemplate jdbctemplate;

public void setJdbcTemplate(JdbcTemplate jdbcTemplate)
this.jdbcTemplate = jdbcTemplate;


protected void beforeProcess()
//............


protected abstract void process();

protected void afterProcess()
//............


public void execute() throws FrameBizException
beforeProcess();
process();
afterProcess()


参考技术D 没问题啊,是不是你那边写错了
推荐用接口来注入,用父类应该也没问题的

以上是关于spring 如何用注解的方式给普通类注入bean的主要内容,如果未能解决你的问题,请参考以下文章

JAVA普通类怎么注入Spring的bean 例如 一个普通的JAVA类 我想引入一个dao层的入库方法。最好用注解方式

spring不用注入注解怎么接口所有实现类bean

spring 抽象类注入问题

Spring学习一(依赖注入/Bean/注解等)

Spring之IOC-注解方式

Spring MVC 注解方式 静态类 注入bean