p命名空间的使用(不推荐用)
xmlns:p="http://www.springframework.org/schema/p"
p:没有xsd文件,直接加上面那句就好了
<!-- singleton和prototype --> <bean id="user" class="com.bdqn.entity.User" scope="prototype"> <property name="username" value="admin"></property> <property name="password" value="123"></property> </bean> <!-- p --> <bean id="user_p" class="com.bdqn.entity.User"
p:username="admin" p:password="123"></bean>
public class testScope { @Test public void test() { //默任singleton ApplicationContext ctx= new ClassPathXmlApplicationContext( "applicationContext.xml"); //客户端1拿到的东西 User user = ctx.getBean("user_p",User.class); System.out.println(user.getUsername());//admin user.setUsername(user.getUsername()+"1"); //客户端2拿到的东西(对唯一实例的修改) User user2 = ctx.getBean("user_p",User.class); System.out.println(user2.getUsername());//admin1 user2.setUsername(user.getUsername()+"2"); //客户端3拿到的东西(对唯一实例的修改) User user3 = ctx.getBean("user_p",User.class); System.out.println(user3.getUsername());//admin12 System.out.println(user==user2);//true System.out.println(user==user3);//true } }
自动装配
1 <!-- 自动装配 -->
<bean id="userDao" class="com.bdqn.dao.UserDaoImpl"></bean>
<bean id="userService" class="com.bdqn.service.UserService"> 2 <bean id="dao" class="com.bdqn.dao.UserDaoImpl"></bean> 3 <bean id="userService2" class="com.bdqn.service.UserService" 4 autowire="byName"> 5 6 </bean>
test类
1 public class TestAutowire { 2 3 @Test 4 public void test() { 5 ApplicationContext ctx= new ClassPathXmlApplicationContext( 6 "applicationContext.xml"); 7 UserService service =(UserService)ctx.getBean("userService2"); 8 service.save(); 9 } 10 11 }
当 autowire="no"时,
默认值,spring默认不进行自动装配,必须显示指定依赖对象
当 autowire="byName"时,输出保存----找属性
根据属性名自动装配,spring自动查找与属性名相同的id
如果找到,则自动注入,否则什么都不做
当 autowire="byType"时,就得删了2个中class相同的一个bean。没有删除就会提示出,找到2个----找属性
根据属性的类型自动装配,spring自动查找与属性类型相同的bean,如果刚好找到唯一的那个,则自动注入
如果找到多个与属性类型相同的Bean,则跑出异常,如果没找到,就什么也不做
当 autowire="constructor"时,---直接找构造方法
和byType类似,不过它针对构造方法,如果spring找到一个Bean和构造方法的参数类型相匹配,则通过构造注入
该依赖对象,如果找不到,就抛出异常
1 <!-- 自动装配,里面的装配都不需要写 2 注意必须满足2点:1、UserServiceImpl.java里的属性名必须和applicationContext.xml里对应的bean id的名字相同 3 2、 在声明里配置一个属性autowire="byName"(通过名字自动装配)也就是说:cn.bdqn.biz.service.impl.UserServiceImpl的属性名与bean的id名称相同就会自动装配--> 4 <!-- 5 <bean id="userServiceImpl" class="cn.bdqn.biz.service.impl.UserServiceImpl" autowire="byName"/> 6 <bean id="userDao" class="cn.bdqn.biz.dao.impl.UserDaoImpl"/> 7 --> 8 9 <!-- autowire="byType" 自动装配类型,根据类型自动装配,类型不能相同 10 也就是说:cn.bdqn.biz.service.impl.UserServiceImpl的属性类型与bean中有相同的类型的时候就会自动装配 11 注:不可以有相同的类型,也就是说不可以有相同的类名存在,ID可有可无,但是一般情况下是存在的,它与其他没有关联--> 12 <!-- 13 <bean id="userServiceImpl" class="cn.bdqn.biz.service.impl.UserServiceImpl" autowire="byType"/> 14 <bean id="userDaoImpl" class="cn.bdqn.biz.dao.impl.UserDaoImpl"/> 15 --> 16 17 <!-- autowire="constructor" 根据类型自动装配,根据构造器的参数显示 18 也就是说:cn.bdqn.biz.service.impl.UserServiceImpl的属性类型与bean中有相同的类型的时候就会自动装配 19 注:执行这个xml的时候,要有构造函数(有参)若容器中没找到与构造器参数类型一致的bean,则抛出异常-->