配置文件
Bean的配置
基本语法
<bean id="" class="" scope="">
scope :设置对象的作用范围:
1.singleton 默认值 创建是单例 每次都是同一个对象
2.prototype 每次获取bean对象都会创建一个新的对象
3.request web项目中之只在request中有效
4.session 在web项目中 该对象在session中有效
5.globalsession 在web项目中 该对象只在portlet环境中有效
SSM中几个名词
IOC 控制反转
DI 依赖注入
AOP 面对切面编程
ORM 对象关系映射
依赖注入
分为构造注入和属性注入
构造注入需要在bean标签中使用constructor-arg标签来配置构造函数中的每一个参数。
<bean id="userBean" class="com.xjy.beans.UserBean"/>
<constructor-arg name="" value="" index="" type="" ref=""></constructor-arg>
<!-- 根据下标设置参数
<constructor-arg index="0" value="小宝"/>
<constructor-arg index="1" value="18"/> -->
<!-- 根据名字设置参数
<constructor-arg name="name" value="小宝"/>
<constructor-arg name="age" value="18"/> -->
<!-- 指定参数类型 -->
<constructor-arg name="name" value="小宝" type="java.lang.String"/>
<constructor-arg name="age" value="18" type="int"/>
<constructor-arg name="birthDate" ref="now"/>
</beans>
name:参数名
value 参数值
index 下标
type 参数类型
ref 引用其他bean对象
属性注入
<bean id="userBean" class="com.xjy.beans.UserBean">
<property name="name" value="大宝"/>
<property name="age" value="18"/>
<property name="birthDate" ref="now"/>
</bean>
name:属性名。注意:Spring是根据setter方法来判断属性的。
value:属性值。
ref:引用其他bean对象。
注意 因为执行属性注入前 Spring容器会调用Bean类无参构造函数 然后把属性注入到对象中 所以需要给Bean类提供一个无参数的构造函数
集合注入
<property name="myStrs">
<array>
<value>AAA</value>
<value>BBB</value>
<value>CCC</value>
</array>
</property>
<!-- 注入set集合 -->
<property name="mySet">
<list>
<value>AAA</value>
<value>BBB</value>
<value>CCC</value>
</list>
</property>
<!-- 注入Map集合 -->
<property name="myMap">
<props>
<prop key="keyA">aaa</prop>
<prop key="keyB">bbb</prop>
</props>
</property>
<!-- 注入properties数据 -->
<property name="myProps">
<map>
<entry key="keyA" value="aaa"/>
<entry key="keyB" value="bbb"/>
</map>
</property>
测试获取B额按对象 (配置文件的获取方法)
ApplicationContext ac = new ClassPathXmlApplicationContext("beans.xml");
UserBean userBean = (UserBean) ac.getBean("userBean");
使用注解
在配置文件中添加包扫描的
<context:component-scan base-package="com.xjy.beans"/>
常用的注解
@Component @Controller @Service @Repository
这4个都是让资源交给Spring管理
@Autowired 变量成员使用该注解 spring容器就会扫描 如果找到创建这个类的对象就会注入到成员属性中但是有可能会出现歧义 如果存在两个或两个以上的子类型 主要给他们指定别名
@Service("userService")
public class UserService {
//根据属性名查找Bean对象,并把该对象设置到该属性中 ()
@Autowired
@Oualifier("StudentDaoImpl")
private IDao dao;
public UserService() {
System.out.println("创建UserService对象...");
}
public void addUser() {
dao.add();
}
}
@Repository
public class StudentDaoImpl implements IDao {
public StudentDaoImpl() {
System.out.println("创建StdentDaoImpl对象...");
}
[添加链接描述](https://img-blog.csdnimg.cn/20190812235502649.png)
public void add() {
System.out.println("执行StdentDaoImpl对象的add方法...");
}
}
IDao 下有2个子类型会出现异常
解决办法:
1)改为子类型的名字;
2)使用@Qualifier指定注入Bean对象的名字;(常常和@Autowire一起使用)
@Resource 是@Autowire和@Qualifier 的结合
@Value
@Scope
设置Bean的作用域。Bean的作用范围有:singleton、prototype、request、session、globalsession。
@PostConstruct:指定初始化方法; 获取bean对象调构造方法后会会调用
@PreDestory:指定销毁方法;
spring零配置
完全脱离xml
就是创建一个类 让他作为配置类
@Configuration
指定spring容器从这个类读取配置信息
@ComponentScan
指定spring扫描的包
属性: basePackages:指定要扫描的包。
使用零注解后测试类应该这样写
@propertySource
加载propertsource文件中的配置
value[]:指定properties文件的位置。如果在src目录下,那么就需要加上classpath前缀。
- 使用步骤:
首先,在src目录下创建一个info.properties配置文件。该文件保存Bean对象的属性值