基本装配使用
1、基于配置文件:
在配置文件中配置一个bean
<bean id="实例的名字,是唯一的" class="实例的类"> <property name="基本类型属性名" value="值"></property> <property name="引用属性名" ref="该类对应的实例ID"></property> </bean>
2、基于注解的方式:
包括实例化的注解,依赖注入的注解,以及全局扫描包的注解;
博主之前写过一篇关于注解的博文,这里就不赘述了;有需要的可以前往查看:注解的使用
3、构造器注入和属性注入
(1)构造器注入:基于构造函数注入;如:
@Autowired public User(@Value("whl")String name, @Value("whl")String pwd) { super(); this.name = name; this.pwd = pwd; System.out.println("有参"); }
在配置文件中配置构造器:
(2)属性注入:调用无参构造函数创建实例后,基于setter方法注入,如:
@Component public class User { private String name; private String pwd; public String getName() { return name; } @Value("whl") public void setName(String name) { this.name = name; System.out.println("name,setter"); } @Value("whl") public void setPwd(String pwd) { this.pwd = pwd; System.out.println("pwd,setter"); } }
同时,在测试类中配置扫描包
@Configuration @ComponentScan(basePackages="test") public class Test { public static void main(String[] args) { ApplicationContext ac = new AnnotationConfigApplicationContext("Test.class"); User user = (User) ac.getBean("user"); System.out.println("user"); } }
setter注入和构造器注入对比
|
实现 |
时效性 |
灵活性 |
构造函数 |
Setter注入 |
Setter访问器 |
差 |
好 |
无参 |
构造器注入 |
有参构造函数 |
好 |
差 |
匹配对应的有参构造函数 |
4、集合属性注入
(1)、list属性注入,在配置文件中进行配置;如一个部门有多个人员:
<bean id="emp1" class="injection.Emp"> <property name="name" value="emp1"></property> </bean> <bean id="emp2" class="injection.Emp"> <property name="name" value="emp2"></property> </bean> <bean id="emp3" class="injection.Emp"> <property name="name" value="emp3"></property> </bean> <bean id="dept" class="injection.Dept"> <property name="name" value="研发部"></property> <property name="emplist"> <list> <ref bean="emp1"/> <ref bean="emp2"/> <ref bean="emp3"/> </list> </property>
</bean>
注:如果list是基本数据类型,就不用 ref ,可以直接用 value ;
(2)、Map属性注入,同样的,在配置文件中进行配置
<bean id="emp1" class="injection.Emp"> <property name="name" value="emp1"></property> </bean> <bean id="emp2" class="injection.Emp"> <property name="name" value="emp2"></property> </bean> <bean id="emp3" class="injection.Emp"> <property name="name" value="emp3"></property> </bean> <bean id="dept" class="injection.Dept"> <property name="empMap"> <map> <entry key="1" value-ref="emp1"></entry> <entry key="2" value-ref="emp2"></entry> <entry key="3" value-ref="emp3"></entry> </map> </property> </bean>
5、内部bean
概念:在bean的内部装配一个只属于他的bean;
外部bean:可以供多个bean来装配;
内部bean示例:
<bean id="devEmp1" class="injection.Emp"> <property name="name" value="研发人员1"></property> <property name="mgr"> <bean id="mgr" class="injection.Mgr"> <property name="name" value="经理"></property> </bean> </property> </bean>
mgr就是一个内部bean,它只能被DevEmp1所使用
外部bean示例:
<bean id="mgr" class="injection.Mgr"> <property name="name" value="经理"></property> </bean> <bean id="devEmp1" class="injection.Emp"> <property name="name" value="研发人员1"></property> <property name="mgr" ref="mgr"></property> </bean> <bean id="devEmp2" class="injection.Emp"> <property name="name" value="研发人员2"></property> <property name="mgr" ref="mgr"></property> </bean>
这个时候 mgr就是一个外部bean,他可以被devEmp1和devEmp2所共同使用
6、bean的继承
在配置中,子类可以直接继承父类的属性的值;
在bean中使用parent属性,继承的是对象中属性的值;
如:
<bean id=”baseDao”> <property name=”sqlSessionFactory” ref=” sqlSessionFactory”></property> </bean> <bean id=”UserDao” parent=”baseDao”></bean>
利用继承,替代了:
<bean id=”UserDao” > <property name=”sqlSessionFactory” ref=” sqlSessionFactory”></property> </bean>
利用继承,可以降低我们配置bean时的代码量;
7、自动装配
Spring是一个巨大的容器,里面有很多实例,自动根据实例的属性和实例直接的匹配关系实现属性赋值
byName:根据属性名和实例的id匹配
byType:根据属性类型和实例的类型进行匹配
基于注解自动装配:
@AutoWired:
属于Spring的注解
只通过byName自动注入
与@Qualifie结合的时候,通过byName实现自动注入
@Resource:
属于Java自身的注解
先byName自动注入,再byType自动注入
8、属性编辑器
概念:类型转换器,Spring在做属性赋值的时候,将字符串类型转换成其他类型(如:Date)的操作,自定义属性编辑器;
实现步骤:
创建自定义属性编辑器类:extends PropertyEditorSupport
public class DatePropertyEditor extends PropertyEditorSupport { /* * text:输入的String类型的值 * 转成property对应的类型 * */ @Override public void setAsText(String text) throws IllegalArgumentException { // TODO Auto-generated method stub SimpleDateFormat sdf = new SimpleDateFormat("yyyy-mm-dd"); try { this.setValue(sdf.parse(text));//text转成Date类型 } catch (ParseException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
在配置文件中配置属性编辑器
<!-- 配置属性编辑器:代理模式(key)——转换类(value) --> <bean class="org.springframework.beans.factory.config.CustomEditorConfigurer"> <property name="customEditors"> <map> <entry key="java.util.Date" value="injection.DatePropertyEditor"></entry> </map> </property> </bean>
最后,它会自动使用,实现属性注入;
PS:因作者能力有限,如有误还请谅解