一,XML配置方式
1,1,通过构造方法注入
<!-- 若一个 bean 有多个构造器, 如何通过构造器来为 bean 的属性赋值 ,可以使用参数位置和类型,区分重载-->
<!-- 可以根据 index 和 value 进行更加精确的定位. -->
<!-- 若字面值中包含特殊字符, 则可以使用 DCDATA 来进行赋值. -->
<bean id="bean" class="com.hello.Bean">
<constructor-arg value="属性1值" index="0"></constructor-arg>
<constructor-arg value="属性2值" index="1"></constructor-arg>
<constructor-arg value="属性3值" type="java.lang.String"></constructor-arg>
</bean>
2, 注入属性值
<bean id="bean实例名" class="bean所在包">
<constructor-arg name="userName" value="KUGA" ></constructor-arg>
</bean>
2.1 list集合注入
<property name="lists">
<!-- 使用 list 元素来装配集合属性 -->
<list>
<ref bean="list"/>
<ref bean="list2"/>
</list>
</property>
也可外部声明全局lists
<!-- 声明集合类型的 bean,需要导入util命名空间 -->
<util:list id="lists">
<ref bean="list1"/>
<ref bean="list2"/>
</util:list>
2.2 使用 Map 元素来装配集合属性
<property name="maps">
<map>
<entry key="AA" value-ref="map1"></entry>
<entry key="BB" value-ref="map2"></entry>
</map>
</property>
2.3 p标签的使用,需要导入p标签库
<bean id="bean" class="包名" p:userName="属性值">
2.4
自动装配autowire属性
自动装配: 只声明 bean, 而把 bean 之间的关系交给 IOC 容器来完成
byType: 根据类型进行自动装配. 但要求 IOC 容器中只有一个类型对应的 bean, 若有多个则无法完成自动装配.
byName: 若属性名和某一个 bean 的 id 名一致, 即可完成自动装配. 若没有 id 一致的, 则无法完成自动装配
2.5
继承parent属性,子类也可以覆盖父类的属性值
设置类为抽象类不可实例化,只能被继承abstract="true",若没指定class属性,则必须是抽象的
2.6
默认情况下 bean 是单例的! 可以设置scope属性改变-
但有的时候, bean 就不能使单例的. 例如: Struts2 的 Action 就不是单例的! 可以通过 scope 属性来指定 bean 的作用域
prototype: 原型的. 每次调用 getBean 方法都会返回一个新的 bean. 且在第一次调用 getBean 方法时才创建实例
singleton: 单例的. 每次调用 getBean 方法都会返回同一个 bean. 且在 IOC 容器初始化时即创建 bean 的实例. 默认值
2.7 导入外部的资源文件,比如配置数据库连接属性,先建立db.properties文件,然后xml读取
<context:property-placeholder location="classpath:db.properties"/>
<!-- 配置数据库数据源 -->
<bean id="dataSource" class="com.jdbc.Jdbc_Connection">
<property name="username" value="root"></property>
<property name="password" value="${password}"></property>
<property name="url" value="${url}"></property>
<property name="driver" value="${driver}"></property>
</bean>
2.8
配置初始化和销毁方法,init-method和destroy-method属性,可以实现bean的初始化和销毁时所处理的工作。
二,工厂方法
1,静态工厂方法
配置文件,
<!-- 1. 通过静态工厂方法: 一个类中有一个静态方法, 可以返回一个类的实例-->
<!-- 在 class 中指定静态工厂方法的全类名, 在 factory-method 中指定静态工厂方法的方法名 -->
<bean id="bean" class="com.工厂方法配置Bean.StaticBeansFactory" factory-method="getBean">
<constructor-arg value="关键字获取类实例"></constructor-arg><!-- 指定需要的实例 -->
</bean>
类实现
//////静态工厂方法
public class StaticBeanFactory {
private static Map<String, bean(类名)> beans=new HashMap<String,类名>();
static{
beans.put("关键字1", new bean(构造方法));
beans.put("关键字2", new bean(构造方法));
beans.put("关键字3", new bean(构造方法));
}
public static Bean getBean(String name){//静态工厂方法,通过关键字调用类
return beans.get(name);
}
}
2,实例工厂方法
配置文件,
<!-- 2. 实例工厂方法: 先需要创建工厂对象, 再调用工厂的非静态方法返回实例-->
<!-- ①. 创建工厂对应的 bean -->
<bean id="bean" class="com.工厂方法配置Bean.InstanceBeansFactory"></bean>
类实现
public class InstanceBeansFactory {
private static Map<String, bean(类名)> beans=null;
public InstanceBeansFactory(){
beans=new HashMap<String,类名>();
beans.put("关键字1", new bean(构造方法));
beans.put("关键字2", new bean(构造方法));
beans.put("关键字3", new bean(构造方法));
}
public static Bean getBean(String name){//静态工厂方法,通过关键字调用类
return beans.get(name);
}
}
三,基于注解的配置方法
-
特定组件包括:
-
@Component:基本注解,标示了一个受Spring管理的组件 (可以混用,spring还无法识别具体是哪一层)
-
@Respository:建议标识持久层组件 (可以混用,spring还无法识别具体是哪一层)
-
@Service:建议标识服务层(业务层)组件 (可以混用,spring还无法识别具体是哪一层)
-
@Controller:建议标识表现层组件(可以混用,spring还无法识别具体是哪一层)
-
对于扫描到的组件, Spring有默认的命名策略 :使用非限定类名,第一个字母小写( UserServiceImpl-》userServiceImpl ), 也可以再注解中通过value属性值标识组件的名称(通常可以将UserServiceImpl —》userService,可以将Impl拿掉,这是一个习惯)
使用@Autowired或@Resource注解方式进行装配 ,这两个注解的区别是:@Autowired默认按类型装配,@Resource默认按名称装配,当找不到名称匹配的bean才会按类型装配。
<!-- 使用注解,自动扫描的包 -->
<context:component-scan base-package="com.zhujie" >
<!-- 1,只扫描repository子包的类。resource-pattern="repository/*.class" -->
<!-- 2,不扫描指定的表达式组件。"
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Repository"/>
-->
<!-- 3,只扫描指定的表达式组件。省略,注意use-default-filters="false" -->
<!-- 4,不扫描指定的类和接口。"
<context:exclude-filter type="assignable" expression="com.zhujie.repository.UserRepositoryImp1"/>
-->
</context:component-scan>