一、无参,有参,无参+setter方法 三种方式配置bean
<?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代表一个对象
id:唯一标识符,同一个配置文件中不能有id相同的bean
class:对象的类型
-->
<!-- 无参构造
1、spring在创建对象时通过class属性得到当前类的字节码对象
2、通过字节码对象调用newInstance调用无参构造方法创建对象
3、再用id作为key,对象作为value将该对象存放到IOC容器中(map)
在默认情况下配置的bean在加载配置文件时就会创建对象,这种方式叫:singleton 单例
如果不想在加载时就创建对象,可以通过scope属性指定为其他的值修改对象创建的时间
protorype:在需要时才创建,而且会创建多个,只要获取一次就会创建一个
singleton:默认的,在加载文件时就创建
request:每请求一次创建一个
session:一次回话创建一个
-->
<bean id="abc" class="com.woniuxy.entity.User" scope="prototype"></bean>
<!-- 有参构造 -->
<bean id="aaa" class="com.woniuxy.entity.User">
<!-- name:属性名 -->
<constructor-arg name="uid" value="1001"></constructor-arg>
<constructor-arg name="account" value="zhangsan"></constructor-arg>
<constructor-arg name="pwd" value="123456"></constructor-arg>
</bean>
<!-- 无参+setter -->
<bean id="bbb" class="com.woniuxy.entity.User">
<!-- 调用setter方法给属性赋值 -->
<property name="uid" value="1002"></property>
<property name="account" value="lisi"></property>
<property name="pwd" value="123456"></property>
</bean>
<!-- 自动装配 autowire 通过某种方式给属性自动赋值
byName : 通过属性名字自动进行赋值,找到属性名字,以属性的名字为寻找条件自动到IOC容器中
寻找id与其相同的bean,然后将bean赋值给该属性
-->
</beans>
二、设置自动装配(对比上面的servlet的配置)
<!-- servlet -->
<bean id="userServlet" class="com.woniuxy.servlet.UserServlet" autowire="byName">
<!-- <property name="userService" ref="userService"></property> -->
</bean>
<!-- 自动装配 autowire 通过某种方式给属性自动赋值
byName : 通过属性名字自动进行赋值,找到属性名字,以属性的名字为寻找条件自动到IOC容器中
寻找id与其相同的bean,然后将bean赋值给该属性(例如:上面的servlet)
byType: 通过得到的属性类型,然后在IOC容器中寻找该类型的bean,给该属性赋值
但是要求ICO中只有一个该类型的bean
constructor: 通过构造方法进行装配,如果是有参会根据参数的类型,去IOC容器中寻找对应类型
的bean,然后作为构造方法的参数进行赋值
autodetect:首先使用constructor进行装配,如果不行切换成byType进行装配
-->
<!-- 设置默认装配方式:
在beans中添加default-autowire="..."
-->
配置完成后在java代码中获取注入
ApplicationContext context =
new ClassPathXmlApplicationContext("spring-context-dao.xml");
//通过类型获取对象
UserServlet userServlet = context.getBean(UserServlet.class);
//也可以通过id获取对象
User user = context.getBean("abc");
三、使用注解实现IOC
配置文件(开启注解扫码)
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
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
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
<!-- 开启注解扫描 -->
<context:component-scan base-package="com.woniuxy"></context:component-scan>
</beans>
注解的使用
1、@Component,@Service,@Controller,@Repository:这四个注解代表,被注解的类将会被纳入IOC容器的管理中
四个注解的作用相同:
@Reponsitory:用于dao层的类
@Service:用于服务层的类
@Controller:用于表示层的类
@Component:用于中立的类
2、@Autowired :它可以对类成员变量、方法及构造函数进行标注,让 spring 完成 bean 自动装配的工作。
首先通过属性名查找,如果找不到通过类型查找,而且即使属性没有setter方法也能赋值