ref: 手动装配
有些东西感觉没必要说那么多, 至少个人觉得是这样的, 因为大家都是干代码的, 写那么多理论还不如看一段简单的代码,然后自己就明白了,所以还是那个demo
image.png
UserDaoImpl.java
public class UserDaoImpl {
public void show(){
System.out.println(11);
}
}
UserServiceDaoImpl
public class UserServiceDaoImpl {
private UserDaoImpl userDaoImpl=null;
public void setUserDaoImpl(UserDaoImpl userDaoImpl) {
this.userDaoImpl = userDaoImpl;
}
public void show(){
userDaoImpl.show();
}
}
在main中调用
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Main {
public static void main(String[] args) {
ApplicationContext applicationContext=new ClassPathXmlApplicationContext("beans.xml");
UserServiceDaoImpl objUserServiceDaoImpl=(UserServiceDaoImpl)applicationContext.getBean("UserServiceDaoImpl");
objUserServiceDaoImpl.show();
}
}
<bean name="userDaoImpl" class="UserDaoImpl"/>
<bean id="UserServiceDaoImpl" class="UserServiceDaoImpl" >
<property name="UserDaoImpl" ref="userDaoImpl"></property>
</bean>
其原理就是在ref的时候会去找bean的userDaoImpl, 这里面我写的是name, 当然也可以是id或者别名
autowire自动装配
氛围三种,其中一种是no,当然这么说也就四种了
no:不使用自动装配
byName:根据名称(set后名)来查抄bean,如果有则装配上
byType:根据类型,不用管bean的id, 但是 同一种类型的baan只能又一个
construction:当前构造器实例化bean时,适用byType的方式装配构造方法
byName:
image.pngpublic class AutoWrieUserDaoImpl {
public void show(){
System.out.println(22);
}
}
public class AutoWrieUserServiceDaoImpl {
private AutoWrieUserDaoImpl autoWrieUserDaoImpl=null;
public void setAutoWrieUserDaoImpl(AutoWrieUserDaoImpl autoWrieUserDaoImpl) {
this.autoWrieUserDaoImpl = autoWrieUserDaoImpl;
}
public void show(){
autoWrieUserDaoImpl.show();
}
}
<bean id="autoWrieUserServiceDaoImpl" class="AutoWrieUserServiceDaoImpl" autowire="byName"/>
byType:
这种类型需要新建一个项目来说明问题, 有很多人都建议少用,因为有的时候太灵活控制不是很好
image.png
public interface UserDao {
void show();
}
public class OneUserDaoImpl implements UserDao {
@Override
public void show() {
System.out.println("OneUserDaoImpl");
}
}
public class TwoUserDaoImpl implements UserDao {
@Override
public void show() {
System.out.println("TwoUserDaoImpl");
}
}
public class UserServiceImpl {
private UserDao userDao=null;
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
public void show(){
userDao.show();
}
}
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean class="OneUserDaoImpl"/>
<bean id="userServiceImpl" class="UserServiceImpl" autowire="byType"/>
</beans>
上面没有问题, 但是由于我们还有一个TwoUserDaoImpl, 他也是继承UserDao, 这里spring把他视为一个类型
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean class="OneUserDaoImpl"/>
<bean class="TwoUserDaoImpl"/>
<bean id="userServiceImpl" class="UserServiceImpl" autowire="byType"/>
</beans>
这样运行直接报错, 因为byType在配置文件中只能有一种类型出现,
constructor:
看了下官方文档, 感觉挺复杂的, 感觉也没啥必要用到
package x.y;
public class Foo {
public Foo(Bar bar, Baz baz) {
// ...
}
}
<beans>
<bean id="foo" class="x.y.Foo">
<constructor-arg ref="bar"/>
<constructor-arg ref="baz"/>
</bean>
<bean id="bar" class="x.y.Bar"/>
<bean id="baz" class="x.y.Baz"/>
</beans>
autowire可以卸载bean上也可以通过default-autowire="byName"写在beans的头上, 写在头上的话就是所有beans内的bean都是这种形式的注入了,
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd" default-autowire="byName">
</beans>
大致就是这么一个情况, 但是对于开发来说我认为byName完全可以满足了, 有的时候本人研究东西可能会屏蔽那些不常用的吧,需要用了就去找文档....
网友评论