Spring基础

1.Spring基础

1.1 IOC
控制反转–创建对象由以前的程序员自己new 构造方法来调用,变成了交由Spring创建对象
依赖注入–拿到的对象的属性,已经被注入好相关值了,直接使用即可。(依赖注入两种方式:setter方法注入和构造方法注入)
setter方法:

<bean id="xx" class="">
	<property name="属性名字" value="xx"/>
<bean>

构造方法注入:

<bean id="xx" class="">
	<constructor-arg name="属性名字" value="xx"/>
<bean>

注入方式

  • 非注解方式
    在创建Product的时候注入一个Category 对象
<bean name="c" class="com.how2java.pojo.Category">
        <property name="name" value="category 1" />
</bean>
<bean name="p" class="com.how2java.pojo.Product">
        <property name="name" value="product1" />
        <property name="category" ref="c" />
</bean>
  • 注解方式
<context:annotation-config/>表示告诉Spring要用注解的方式进行配置

注入对象行为的注解
– @Autowired:可在对象属性或者属性的setter()方法上面使用@Autowired进行注解

– @Resource():可将@Autowired替换成@Resource(name=“xx”)【@Resouce放在属性上方,需要注释掉setter方法】

==注:==属性注解需要在xml文件中加入<context:annotation-config />

Bean的实例化
– 无参构造器的实例化方式(一般情况)

//创建工厂
ApplicationContext applicationContext=new ClassPathXmlApplicationContext(configLocation:“ApplicationContext.xml”);
//通过工厂获得类的实例
Bean bean=(Bean)applicationContext.getBean("bean");

– 静态工厂实例化
即创建一个工厂类含有静态工厂方法,返回类的实例(静态方法可直接用类名加小圆点调用静态方法)
配置如下:

<bean id="xx" class="工厂类" factory-method="静态工厂方法"/>

– 实例工厂实例化
即创建一个工厂类,含有返回类的实例的方法,此方法非静态(实例化时需要先实例化工厂类)

<bean id="beanFactory" class="工厂类"/>
<bean id="xx" factory-bean="beanFactory" factory-method="工厂方法"/>

Bean对象本身的注解

– 修改applicationContext.xml,什么都去掉,只新增

<context:component-scan base-package="com.how2java.pojo"/>  作用是告诉Spring,Bean都放在com.how2java.pojo这个包下

@Component(“name”):为类加上@Component注解,则表明此类是Bean
:另外,因为配置从applicationContext.xml中移出来了,所以属性初始化放在属性声明上进行了。

private String name="product 1";
private String name="category 1";

1.2 AOP
AOP 即 Aspect Oriented Program面向切面编程
首先,在面向切面编程的思想里面,把功能分为核心业务功能周边功能
所谓的核心业务,比如登陆,增加数据,删除数据都叫核心业务
所谓的周边功能,比如性能统计,日志,事务管理等等

周边功能在Spring的面向切面编程AOP思想里,即被定义为切面

在面向切面编程AOP的思想里面,核心业务功能和切面功能分别独立进行开发
然后把切面功能和核心业务功能 “编织” 在一起,这就叫AOP

1. 功能分两大类,辅助功能和核心业务功能
2. 辅助功能和核心业务功能彼此独立进行开发
3. 比如登陆功能,即便是没有性能统计和日志输出,也可以正常运行
4. 如果有需要,就把"日志输出" 功能和 "登陆" 功能 编织在一起,这样登陆的时候,就可以看到日志输出了
5. 辅助功能,又叫做切面,

:这种能够选择性的,低耦合的把切面和核心业务功能结合在一起的编程思想,就叫做切面编程

– 切点(pointcut):进行拦截操作的方法

–通知(advice):进行拦截操作后需要进行的操作(事务管理、性能统计)

–切面(Aspect):切点和通知的组合

  • xml方式配置AOP
<bean name="s" class="com.how2java.service.ProductService">
</bean>    声明业务对象

<bean id="loggerAspect" class="com.how2java.aspect.LoggerAspect"/>声明日志切面

<aop:config>
	<aop:pointcut id="loggerCutpoint" 
		expression="execution(* com.how2java.service.ProductService.*(..)) "/>指定右边的核心业务功能
	<aop:aspect id="logAspect" ref="loggerAspect">
		<aop:around pointcut-ref="loggerCutpoint" method="log"/>
	</aop:aspect>指定左边的辅助功能
</aop:config>

然后通过aop:config把业务对象与辅助功能编织在一起。
execution(* com.how2java.service.ProductService.*(..)) 
这表示对满足如下条件的方法调用,进行切面操作:
* 返回任意类型
com.how2java.service.ProductService.* 包名以 com.how2java.service.ProductService 开头的类的任意方法
(..) 参数是任意数量和类型
  • 注解方式配置AOP
    业务类(核心业务功能):使用@Component(name") 注解
    切面:
    @Aspect 注解表示这是一个切面
    @Component 表示这是一个bean,由Spring进行管理
    @Around(value = “execution(* com.how2java.service.ProductService.*(…))”) 表示对com.how2java.service.ProductService 这个类中的所有方法进行切面操作【放在切面方法上面】
    :使用注解方式时,要去掉applicationContext.xml中原有的信息,添加下面:
<context:component-scan base-package="com.how2java.aspect"/>
<context:component-scan base-package="com.how2java.service"/>
扫描包com.how2java.aspect和com.how2java.service,定位业务类和切面类
<aop:aspectj-autoproxy/>  
找到被注解了的切面类,进行切面配置

1.3注解方式测试

  1. @RunWith(SpringJUnit4ClassRunner.class)
    表示这是一个Spring的测试类

  2. @ContextConfiguration(“classpath:applicationContext.xml”)
    定位Spring的配置文件

  3. @Autowired
    给这个测试类装配Category对象

  4. @Test
    测试逻辑,打印c对象的名称

1.4切面类型

– Advisor:一般切面,对目标类所有方法进行拦截

–PointcutAdvisor:代表具有切点的切面,可以指定拦截目标类的哪些方法

1.3 反射
定义:通过获取类的class对象,动态获取类的信息,调用类的方法
方式:java反射class有三种方式,反射创建对象有两种方式
反射的方式:

//1、第一种方式-->Class.forName("类名字符串");
//注:类名字符串是"包名+类名" 返回Class的对象。(这种是最常用的方法)
Class c1=Class.forName("csdn.Student");
//2、第二种方式-->先创建对象,再用对象调用getClass()方法,即实例对象.getClass().返回运行时类。
//任何一个java对象都有getClass()方法
Student s=new Student();
Class c2 = s.getClass();
//3、第三种方式-->类名.class。返回Class的对象。(每个类都有class属性)
Class c3=Student.class;

创建对象的方式
2.1、直接用字节码文件获取对应实例
// 调用无参构造器 ,若是没有,则会报异常

Object o = clazz.newInstance(); (强制转换) 

2.2、有带参数的构造函数的类,先获取到其构造对象,再通过该构造方法类获取实例:
/ /获取构造函数类的对象

Constructor constroctor = clazz.getConstructor(String.class,Integer.class); 

// 使用构造器对象的newInstance方法初始化对象

Object obj = constructor.newInstance("龙哥", 29); 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值