学习一天做总结,其中有我写的笔记,有老师的笔记,有网上找的视频内容,错误内容可不可以告知,权侵删。
spring是什么?
是容器框架,就是IOC+AOP,
作用:可以配置各种bean(action/service/domain/dao),并且可以维护bean与bean之间的关系,
bean元素的作用:
当我们的spring框架加载的时候,spring就会自动创建一个bean对象,并放入内存
ioc是什么:
(inverse of control)控制反转,就是把创建对象(bean)、维护对象(bean)的关系的权利从程序中转移到spring的容器(applicationContext.xml)中
实例:UserService.java中有个ByService.java的属性,xml中:
<bean id=”userService” class=”com.service.UserService”>
<!--注入:--!>
<property name=”name”>
<value>赵</value></property>
<!--依赖,在userService中引用byService bean-->
<property name=”byService” ref=”byService” />
</bean>
<bean id=”byService” class=”com.service.ByService”>
<property name=”name” value=”郑” />
</bean>
自动装配、获取bean的方法:
ApplicationContext ac=new ClassPathXmlApplicationContext("application-context.xml");
1、ac.getBean(“name”)
2、ac.getBean(User.class)
3、ac.getBean(“name”,User.class)
DI是什么:
依赖注入,依赖:一个bean中插入另一个bean,<property name="byService" ref="byService" />
注入:将属性的值注入到<property name="name" value="小刘" />中
注入属性方式:
注入的意思:一个类实例化后属性的值不是在类中赋值,是在XML文件中赋值的,叫注入属性。
1、setter注入,User.java类中需要有setter方法,bean对象中通过setter方法,.setName()方法给属性赋值,XML文件中:
<bean id=”dog1” class=”com.bwf.entity.Dog”>
<property name=”type” value=”二哈” />
<bean>
2、构造方法注入,通过bean对象中的构造器给属性赋值。XML文件中:
<bean id=”dog2” class=”com.bwf.entity.Dog”>
<constructor-arg value=”哈巴狗”><constructor-arg/>
<bean>
其中value中的值叫字面值,是String。
怎么把集合注入值:用<list></list>,把3个值注入empName
<property name=”empName”>
<list>
<value>”a”</value>
<value>”b”</value>
<value>”c”</value>
</list>
怎么把<list>对象注入值:用<list></list>,把3个值注入empName
<property name=”empName”>
<list>
<ref bean=”emp1” />
<ref bean=”emp2” />
</list>
</property>
依赖:
Spring 允许用户通过denpends-on属性设定Bean前置依赖的Bean,前置依赖的Bean会在本Bean实例化之前创建好。
如果前置依赖于多个Bean,则可以通过逗号,空格或的方式配置Bean的名称。
<bean id=”person” class=”com.bwf.entity” p:name=”赵武” p:car-ref=”car1” denpend-on=”car1”></bean>
bean的继承:
<bean id="car2" class="com.bwf.entity.Car">
<property name="type" value="宝马"></property>
<property name="factory" value="大众"></property>
<property name="price" value="200000"></property>
</bean>
<bean id="car3" parent="car2" p:type ="大众" ></bean>
上面car3继承car2, type改为大众,p要XML最上面引入配置。
bean生命周期:
1、实例化:
当程序加载XML文件时就开始实例化bean(前提是scope=singleton),把bean实例导入内存中,示例:class中构造函数中写入syso方法。
2、调用setter设置属性,设置属性值<property name=”” value=””>
3、调用BeanNameAware接口(bean名字关注)的setBeanName()方法
如果该类实现了BeanNameAware(bean名字关注)接口,则可以通过setBeanName方法获取该bean的id号。
4、调用BeanFactoryAware接口(bean工厂关注)的setBeanFactory()方法
如果该类实现了BeanFactoryAware(bean名字关注)接口,则可以通过setBeanFactory()方法获取该bean的工厂。
5、调用ApplicationContextAware接口(上下文关注)的setApplicationContext()方法
如果该类实现了这个接口,则可以通过setApplicationContext()方法获取该bean的上下文。
6、如果一个bean和后置处理器(BeanPostProsessor)关联,则自动调用后置处理器的
postProsessBeforeInitialization()方法。
7、如果类实现了initializingBean接口,则会调用afterpropertiesSet()方法,
8、调用定制的初始化方法,如果自己在bean中写<bean init-method=”init” />则可以在bean中定义自己的初始化方法init()。
9、如果一个bean和后置处理器(BeanPostProsessor)关联,则自动调用后置处理器的
postProsessAfterInitialization()方法。
10、使用bean。
11、容器关闭。
12、可以通过实现DisposableBean接口来调用的destroy()方法。
13、可以在Bean中<bean destroy-method=”fun1” />,调用定制的销毁方法。
小结:实际开发中,没有用到这么多步骤,用的多的是:
1--->2--->6--->9--->11
上面的是通过applicationcontext创建的bean
通过beanfactory创建的bean生命周期要少:
1--->2--->3--->4--->7--->8--->10--->11--->12--->13
Bean的作用域:5个:
<bean id="testScope" class="com.bwf.test.TestScope" scope=""></bean>
其中scope有四种属性:
1、request:只有一个bean,一次请求得到一个bean,重新请求再得到一个bean,上个bean废弃,相当于重新new个bean。
2、session:针对整个session会话
3、singleton:默认属性,单例,最多创建一个,都引用的是同一个对象
4、prototype:多份,每次都是一份新的实例。
5、global-session:MyEclipse好像没有这个了
注解配置spring bean:
1)application-context.xml中把application-context.xml勾中
a、<beans>中写上<context:annotation-config /> 代表启用注解方式
b、<beans>中写上:
<context:component-scan base-package="com.bwf" />:
指定要扫描的包成为spring bean
2)注册spring bean(被调用的地方):class表名上写:
@Component : 通用的spring bean,无需指定创建的bean的id的值,默认的命名策略:类名首字母小写,作为默认的id值。
@Component(value=”abc”) :abc代替了<bean>中的id=”abc”
@Controll : 控制器级别注解,通常用来注解控制器
@Service :service级别注解,通常用来注解service
@Repository : dao级别注解,通常用来注解dao:
@Repository(value=”name”)