DAY01
创建项目
module文件
src
main
java : 实例对象(pojo)
resources : spring管理的bean池文件
test --- -测试文件
测试类:用注解时: 是返回值必须为:void
java : 实例对象(pojo) :
/**怎么实例化对象:
-
1. 得到他的对象
-
xxx.getInstance(实例化对象)
-
2. 拿到它的类型
-
#得到他的对象,并拿到他的类型,得到的对象是<<<<<<完整的>>>>实例化对象#
工厂模式()
public class 类名 implements FactoryBean
{
@Override
public Calendar getObject() throws Exception {
return null;
}
@Override
public Class<?> getObjectType() {
return null;
}
}
resources : spring管理的bean池文件
<bean id="calendar" class="com.jt.factory.StaticFactory" factory-method="getCalendar" />
<!-- 实例类中,非静态资源(没有static修饰的资源的): 调用方式:通过对象调用方法 -->
<bean id="instance" class="com.jt.factory.InstanceFactory" />
<bean id="calendar1" factory-bean="instance" factory-method="getCalendar"/>
<!-- 工厂模式: 调用方式 -->
<bean id="springFactory" class="com.jt.factory.SpringFactory" />
关于注解的说明
1).@Controller 用来标识Controller层的代码 相当于将对象交给Spring管理
2).@Service 用来标识Service层代码
3).@Repository 用来标识持久层
4).@Component 万用注解
关于属性的注解
- 关于注解的说明
- @Autowired: 可以根据类型/属性名称进行注入 首先按照类型进行注入如果类型注入失败,则根据属性名称注入
- @Qualifier: 如果需要按照名称进行注入,则需要额外添加@Qualifier
- @Resource(type = “xxx.class”,name=“属性名称”)
- 关于注解补充: 由于@Resource注解 是由java原生提供的,不是Spring官方的.所以不建议使用
上述的属性的注入在调用时 自动的封装了Set方法,所以Set方法可以省略不写
关于编辑配置类
-
@Configuration //标识我是一个配置类 相当于application.xml
//设定包扫描的路径 -
@ComponentScan(“com.jt”)//如果注解中只有value属性 则可以省略
-
@PropertySource
-
@PropertySource(“classpath:/user.properties”)
注解说明: @PropertySource 作用: 加载指定的pro配置文件 将数据保存到Spring容器中 -
@Value
java @Value(123) 将123值赋值给Id @Value(" u s e r . i d " ) 在 S p r i n g 容 器 中 查 找 k e y = u s e r . i d 的 数 据 . 通 过 {user.id}") 在Spring容器中查找key=user.id的数据.通过 user.id")在Spring容器中查找key=user.id的数据.通过{}语法获取
Spring容器管理业务数据@Bean注解
@Bean作用
通过该注解,可以将业务数据实例化之后,交给Spring容器管理. 但是@Bean注解应该写到配置类中.
Spring注解模式执行过程
1).当程序启动Spring容器时 AnnotationConfigApplicationContext 利用beanFactory实例化对象
2).根据配置类中的包扫描开始加载指定的注解(4个). 根据配置文件的顺序依次进行加载
3).当程序实例化Controller时,由于缺少Service对象,所以挂起线程 继续执行后续逻辑.
当构建Service时,由于缺少Dao对象,所以挂起线程 继续执行后续逻辑.
当实例化Dao成功时,保存到Spring所维护的Map集合中. 执行之前挂起的线程.
所以以此类推 所有对象实现封装.最终容器启动成功
关于AOP名词介绍
1).连接点: 用户可以被扩展的方法
2).切入点: 用户实际扩展的方法 (哪个方法可以扩展,就给他加个自定义主角
3).通知: 扩展方法的具体实现 (加入的内容)
4).切面: 将通知应用到切入点的过程
通知类型(必会)
before: 在目标方法执行之前执行
afterReturning: 在目标方法执行之后返回时执行
afterThrowing: 在目标方法执行之后,抛出异常时执行
after: 无论程序是否执行成功,都要最后执行的通知
around: 在目标方法执行前后 都要执行的通知(完美体现了动态代理模式)
功能最为强大 只有环绕通知可以控制目标方法的执行
关于通知方法总结:
1.环绕通知是处理业务的首选. 可以修改程序的执行轨迹
2.另外的四大通知一般用来做程序的监控.(监控系统) 只做记录
切入点表达式
概念:当程序满足切入点表达式,才能进入切面,执行通知方法.
1.bean(“bean的ID”) 根据beanId进行拦截 只能匹配一个
2.within(“包名.类名”) 可以使用通配符*? 能匹配多个.
粒度: 上述的切入点表达式 粒度是类级别的. 粗粒度.
3.execution(返回值类型 包名.类名.方法名(参数列表…))
粒度: 控制的是方法参数级别. 所以粒度较细. 最常用的.
4.@annotation(包名.注解名) 只拦截注解.