大家好,欢迎来到IT知识分享网。
1.Spring环境搭建
1.1创建工程
配置pom.xml
手动刷新,Maven下载jar包
1.2测试
1.3继承junit
2.spring详解
2.1控制反转IOC
传统new一个对象:
@Test public void testMaster(){ Master master = new Master(); master.sayHellow(); }
Master对象master在testMaster方法创建,master对象控制权属于testMaster
spring中,没有new Master操作
通过Spring的AplicationContext获得其中:context.getBean(“maste”)
getBean,方法的参数值master,对应的是spring-context..xml中的bean的id:
<bean id="master"class="pojo.Master"></bean>
2.2控制反转意义
补:ApplicationContext接口
示例:
缺点:生成对象更复杂(使用反射编程,损耗了效率)
优点:提高维护性、灵活性
例:猫和狗都是宠物,猫是喵喵叫,狗是汪汪叫。我们可以通过三个类来描述宠物、猫、狗之间的关系。在pojo包下创建三个类,Pet,Dog,Cat
package pojo; public abstruct class Pet{ //宠物都会叫,但叫不同 public abstruct void shout(); }
packag pojo; class Cat extends Pet{ @Override public void shout(){ System.out.println("喵喵"); } } class Dog extends Pet{ @Override public void shout(){ System.out.println("汪汪"); } }
如果在代码中需要修改业务需求就需要修改业务代码。
耦合性高
为了降低耦合,我们可以将Cat或Dog对象交给Spring管理,在spring-context.xml中添加一个bean:
<bean id="pet"class="pojo.Dog"></bean>
@Test public void testPet(){ ApplicationContext context new classPathXmlApplicationContext("spring-config.xml); Petpet (Pet)context.getBean("pet"); pet.shout() }
3.多种方式注入
注解注入:(名称和位置)
3.1属性注入(setter注入)
属性注入:通过属性的setter方法进行注入,需要注入的属性必须有setter方法且命名必修符合规范
例:属性名abc,注入方法setABC()
<property name="属性名" value="基本类型的属性值"/> <property name="属性名" ref="对象的bean的id"/>
3.11注入基本类型
在Master类中添加name和age属性并添加getter/,setter方法。
public class Master{ private string name; private Integer age; //getter/setter暗
配置bean并注入age和name:
<bean id="master"class="pojo.Master"> <property name="name"value="张三"/> <property name="age"value="20"/> </bean>
通过property标签为对象注入属性。
<property name=“属性名”value=“属性值"/>
注入属性:
3.12注入对象类型
3.13集合类型
3.2构造方法注入
创建对象时注入属性
3.21按类型注入
// 实体类如下: @Data public class test { private String name; private Integer sex; public test(String name,Integer sex){ this.name=name; this.sex=sex; } } // XML文件如下 test.xml <?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"> <!--set方式注入 id是注入bean中的名字 class 是全限定类名 constructor-arg 是按照构造方式注入 index 是按照成员变量在构造函数中的参数的第几个 name 表示成员变量名 type 表示类型 value 表示值 ref 表示引用 可引用另外一个注入到Spring的中的值 --> <bean id="student1" class="com.example.spkie.model.test"> <constructor-arg index="0" name="name" value="构造方法注入"></constructor-arg> <constructor-arg index="1" name="sex" value="50"></constructor-arg> </bean> </beans>
3.22按位置注入
3.23按名称注入–推荐
3.命名空间注入–类似属性注入
3.4工厂方法注入
3.5使用注解
注解注入:(名称和位置)
4.Bean的生命周期和作用域
4.1生命周期
1.实例化Bean
实例化不是初始化,是为bean分配内存空间
2.设置属性(对象注入)
3.Bean初始化
执行各种通知:Awear通知
执行初始化前置方法
执行构造方法:·执行@PostConstruct;执行init-method)方法;
执行初始化后的后置方法
4.使用Bean
5.销毁Bean
销毁bean的方法:@PreDestroy和destroy-method方法
4.2作用域
六个作用域:
设置作用域:
@Component public class UserBeans { @Bean(name = {"userinfo"}) public User getUser(){ User user = new User(); user.setId(1); user.setName("小狗"); return user; } } @Component public class BeanScope1 { @Autowired private User userinfo; public User getUser(){ User user = userinfo; user.setName("张三"); return user; } } @Component public class BeanScope2 { @Autowired private User userinfo; public User getUser(){ return userinfo; } } public class Main { public static void main(String[] args) { ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml"); BeanScope1 beanScope1 = context.getBean(BeanScope1.class); User user1 = beanScope1.getUser(); System.out.println("BeanScope1:" + user1); BeanScope2 beanScope2 = context.getBean(BeanScope2.class); User user2 = beanScope2.getUser(); System.out.println("BeanScope2:" + user2); } }
设置值–直接设置
@Component public class UserBeans { @Bean(name = {"userinfo"}) @Scope("prototype") public User getUser(){ User user = new User(); user.setId(1); user.setName("小狗"); return user; } }
设置值–枚举设置
@Component public class UserBeans { @Bean(name = {"userinfo"}) @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) public User getUser(){ User user = new User(); user.setId(1); user.setName("小狗"); return user; } }
5.AOP
5.1AOP概念
自动代理实现AOP
5.2前置增强
监控程序是否进入方法
Method method 反射回的方法(当前监控的方法)
Object objects 方法里的参数
ONullable Object o 当前方法所在类
增强类需声明成bean
测试方法:
测试类:
5.2后置增强
ONullable Object returnVal 方法返回值
Method method 反射回的方法(当前监控的方法)
Object objects 方法里的参数
ONullable Object o 当前方法所在类
5.3异常抛出增强
5.4环绕增强
5.5最终增强
最终增强:和环绕增强相比没有前置增强
5.6自定义增强
写入增强
普通的java类写入增强
注入bean,使用asepect标签,aop注入增强
5.7切入点excution表达式
5.8 aspectj实现aop
即注解方式实现AOP
定义aspect.service类
使用@PoinCut定义注解
开启增强:
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/126925.html