spring配置文件中每个bean默认为单例的
,即通过配置scope的属性
<bean id="dog" class="com.icss.model.Dog" scope="singleton">
<property name="dogName" value="小汪"></property>
</bean>
多例
<bean id="person" class="com.icss.model.Person" scope="prototype">
</bean>
单实例
的bean组件默认初始化的时间是:spring容器初始化的时候实例化
多实例
的bean组件默认初始化时间是:每次访问的时候实例化
可以指定单实例的bean组件在第一次访问的时候实例化:
<bean id="" class="" lazy-init="true"></bean>
当我们加载bean时,可能需要对其进行初始化操作,当我们关闭spring容器时,可能需要对bean进行销毁操作。spring提供了init-method
和destroy-method
进行配置。
单例的bean下,我们给person新添加了init()方法和destroy方法
public class Person {
private String name;
private String age;
//初始化的方法
public void init()
{
System.out.println("我开始初始化啦");
}
public void destroy()
{
System.out.println("我销毁啦");
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
public void eat()
{
System.out.println("人类必须要吃食物,否则挂掉");
}
}
通过配置文件绑定
<bean id="person" class="com.icss.model.Person" init-method="init"
destroy-method="destroy">
</bean>
当我们运行测试代码:
@Test
public void testD(){
// 获取spring容器对象
ClassPathXmlApplicationContext ac =
new ClassPathXmlApplicationContext("applicationContext.xml");
// 获取容器中管理的对象,getBean方法中的参数即为bean的id属性值
Person person = (Person) ac.getBean("person");
// 测试容器实例化的对象是否成功
person.eat();
ac.close();
//System.out.println(boy.getDog().getDogName());
}
结果:
![](https://img.haomeiwen.com/i1527003/a595ad5b32c0035f.png)
当我们将person设置成多例prototype时,spring不能够去执行销毁函数,原因:根据java的垃圾回收机制,如果是单例,它的生命周期是和容器的生命周期一致的,而且只有一个。如果是多例的话,创建多个不及时销售,会造成内存溢出
。
DI 依赖注入:
(手动注入)构造函数传入值:
<bean>
<constructor-arg index="0" value=""></constructor-arg>
</bean>
`(手动注入)setter方法注入
<property name="" value=""></property>
<property name="" ref=""></property>
自动注入:
ByName和ByType
byType
:按类型匹配,如果容器中有多个同种类型的对象,依赖注入失败。
byName
:按bean的id匹配,属性名与bean的id属性值保持一致。
<bean id="student" class="com.icss.model.student"
autowire="byName">
</bean>
<bean id="person" class="com.icss.model.person" >
</bean>
通过注解实现:
Spring 3.0以后版本可使用
1、导入jar包 AOP的jar包
2、需要有context包
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>${spring.version}</version>
</dependency>
修改spring配置文件的信息
<?xml version="1.0" encoding="UTF-8"?>
<!-- 命名空间、指定标签满足w3c的规范、指定约束文件的路径(命名空间+约束文件的路径) -->
<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
">
</beans>
加入context文件约束。值得注意的一点是,顺序不能乱,context后面需要紧接着.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
开启自动扫描:配置有注解的包,对其进行扫描
<context:component-scan base-package="com.xinge.*"></context:component-scan>
注解配置:
@Component (不知所在)
@Service (服务层)
@Repository (dao层)
@Controller(value="userServlet")
@Resource(name="userDao") 初始化对象中的Bean组件类型的属性值
@AutoWired 自动注入
@Scope(value="prototype")
例子:
@Repository
public class UserDao
{
}
@Service(value="userService")
public class UserService {
//自动注入的方式,当然,也可以@Resource
@Autowired
private UserDao dao;
public UserDao getDao() {
return dao;
}
public void setDao(UserDao dao) {
this.dao = dao;
}
}
@Controller
@WebServlet("/LoginServlet.do")
public class LoginServlet extends HttpServlet {
@Resource(name="userService")
private UserService Ser;
public UserService getSer() {
return Ser;
}
public void setSer(UserService ser) {
Ser = ser;
}
}
网友评论