学习Spring的相关笔记,还没完全学完,感觉上要点就这么多吧,主要就是配置。
IOC:
ApplicationContext (IOC容器的接口) ClassPathXmlApplicationContext
ApplicationContext ioc=new ClassPathXmlApplicationContext("ioc.xml");
同一个组件在IOC中是单实例的
p名称空间:XML配置文件下面namespace 勾选
p:age="14"直接写到bean标签里
复杂赋值,都在标签体中
<bean id="person01" class="com.zhous.www.Person">
<property>
<!--进行复杂赋值,不能value="null" -->
<null/>
</property>
</bean>
------------------
<bean id="person01" class="com.zhous.www.Person">
<property name="car" ref="car01"></property> <!--引用其他bean-->
</bean>
--------------------
<bean id="person01" class="com.zhous.www.Person">
<bean id="car01" class="com.zhous.www.Car">
<property name="car11"></property> <!--相当于重新new了一个Car-->
</bean>
</bean>
----------------------
<bean id="person01" class="com.zhous.www.Person">
<property>
<list> <!--List的使用 list标签-->
<bean id="car01inner" class="com.zhous.www.Car"> <!--内部new了一个对象-->
<property name="car11"></property>
</bean>
<ref bean="car02"/> <!--引用外部bean-->
</list>
</property>
</bean>
----------------------
<bean id="person01" class="com.zhous.www.Person">
<property name="car11"></property> <!--相当于重新new了一个Car-->
<property name="maps">
<map>
<entry key="key01" value="abc"></entry>
<entry key="key02" value="asdf"></entry>
</map>
</property>
</bean>
=======================
<beans 。。。>
<bean id="person01" class="com.zhous.www.Person"></bean>
<util:map id="map01"> <!--可引用的map-->
<entry key="key01" value="abc"></entry> <!--填元素就行-->
<entry key="key02" value="asdf"></entry>
</util:map>
</beans>
上面内部beanid="car01inner"是不能获取到的;
properties类型,value直接写在标签体中
级联属性可以修改属性的属性 ,如下
<property name="car11.price" value="232434"></property>
配置信息继承,只是信息:
<bean id="person01" class="com.zhous.www.Person" parent="person02">
<property name="car11" value="abc"></property> <!--变化的写出来-->
</bean>
bean按照从上到下创建,但可以通过depends-on属性来决定先后
bean scope作用范围属性,=“prototype” 即为多实例(默认单实例,启动创建),引用一次创建一次,启动时不创建。 /数据库连接池最适合单适例!!!!
工厂创建对象:
静态工厂:
<bean id="001" class="xx.xx.xx.XXstaticFactory" factory-method="getAirplane">
<constructor-arg name="jzname" value="xxx"></constructor-args> <!--传递参数-->
</bean>
实例工厂:
<bean id="airplanefactory1" class="xx.xx.xx.AirplaneFactory"</bean><!--先实例工厂-->
<bean id="airplan1" class="xx.xx.xx.Airplane" factory-bean="airplanefactory1"><!--指定工厂-->
<constructor-arg name="jzname" value="xxx"></constructor-args> <!--传递参数-->
</bean>
1。编写一个factorybook的实现类,继承FactoryBean,后面范型是要创建的类型。
2。FactoryBean接口实现3个方法,分别是“产生对象”、“什么类型”、“是否为单例”。
IOC关闭时单例会销毁,多例不会
后置处理器
实现后置处理器接口BeanPostProccessor,在各个BEAN初始化(无论有无自带的init初始化方法)前后执行
数据库连接池bean单例:(导入C3P0 jar包)
class=“XXX.ComboPooledDataSource” ,属性可提示。
程序中写DataSource bean=ioc.getBean(DataSource.class)
bean.getConnection();这是拿一个连接
spEL:
Spring表达式 #{}
<bean id="abc" class="XXXX.Car">
<property name="name" value="#{book1.name}"></property>
<property name="salary" value="#{234*32}"></property>
<property name="name" value="#{car}"></property> <!--此处相当于引用-->
<property name="ddd" value="#{T(静态全类名).(1,1)方法名可传参}"></property><!--引用静态方法,不用静态用对象的话T去掉-->
</bean>
spring中类加注解,快速加入IOC容器管理中
1步:四种注解:
@Controller 控制器,给sevlet加
@Repository 数据库,dao持久层
@Service 业务逻辑 BookServie
@Component 其他
以上再加@Scope(value=“proptype”)改为多实例
2步:namespace->context
<context:component-scan base-package></context:component-scan>
<!--扫基础包下所有的类,扫进来后bean的id默认为类名首字母小写,要改的话在注解后加括号改-->
3.一定要导入aop包支持注解模式
@Autowired自动装配 ,
写在类属性前 要有前面4种注解才用这个注解,也就是要在容器中;后面加(required=false)找不到拉倒
写在其他位置也可,都会自动给各属性赋值
@Qualifier(“xx”) ,指定变量名装配,也可以写在参数上:(可写在属性上,方法上,参数上)
@Qualifier("bookservice") BookService bookservice
都是注解:
@Autowired spring的;
@Resource javaee的,扩展性强
@Inject EJB的,不用
泛型:
Spring中可以用带泛型的父类确定子类的类型
AOP
1。导包
2。写切面类,里面静态方法
==========这以下都是基于注释的AOP=
3。在切面类前加@Aspect ,将类写进配置文件中(类加@Component);
4。在切面类的静态方法前加
@Before(execution(public int 包.切入类.方法名(int,int))) 以下同,其中星号代表所有方法,也可以写具体方法
@After
@AfterReturning
@Around
5。配置文件中namespace命名空间的aop打开,配置文件中加入
<aop:aspectj-autoproxy></aop:aspectj-autoproxy>
6。配对了话方法上有红色小箭头
7。使用Bean时,要用接口类,不要用原类,这样才能起作用。接口不加在容器中。
8。通配符:
Math*.* //表示以Math开头的类的所有方法
Math*.cal(int,*) //表示任参数,重载
Math*.cal(..) //匹配任意参数个数及类型
9。静态方法后加(JoinPoint joinpoint)参数,即可调用:
Object[] args=joinpoint.getArgs[];
System.out.println(Array.alist(args)); //打印参数
Signature signature=joinpoint.getSignature();
String name=signature.getName(); //获取方法名
10。切入点表达式抽取:
@Pointcut("execution(public int 包.切入类.方法名(int,int))") //在注释中写上Pointcut
public void abc(){} //空建一个方法
//后面注释中就可以引用abc(),如@Before(value="abc()"")
@Around 环绕通知,全了,相当于各个标签都包含在内了
JDBD Template
配置中数据连接相关:
1。context:component-scan 全扫
2。context:property-placeholder location: … 存property文件
3。bean一个数据源
使用Bean连接数据库后,
String sql="UPDATE employee SET salary=? WHERE emp_id=? ";
int update=jdbcTemplate.update(sql,1300.00,5); //两个问号 成功返1
//具名参数,即把问号换成参数 ? :emp
String sql="UPDATE employee SET salary=:sal WHERE emp_id=:emp ";
//前提是配一个有具名参数的bean NamedParameterJdbcTemplate ,配置时加入构造参数,指定数据源
Map<String,Object> paraMap=new HashMap<>();
paraMap.put("sal","1000"); //第一个为key,键值为参数名,第二个为值